VC实现快递查询
#include <iostream>
#include <string>
#include <cstdlib>
#include <afxinet.h>
#include "tinyxml.h"
#pragma comment(lib, "tinyxml.lib")
#pragma comment(lib, "tinyxmlSTL.lib")
using namespace std; void ConvertUTF8ToANSI(CString strUTF8,CString &strANSI) //
{
int nLen = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (LPCTSTR)strUTF8, -1, NULL, 0);
//返回需要的unicode长度
WCHAR *wszANSI = new WCHAR[nLen+1];
memset(wszANSI, 0, nLen * 2 + 2);
nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8, -1, wszANSI, nLen); //把utf8转成unicode
nLen = WideCharToMultiByte(CP_ACP, 0, wszANSI, -1, NULL, 0, NULL, NULL); //得到要的ansi长度
char *szANSI=new char[nLen + 1];
memset(szANSI, 0, nLen + 1);
WideCharToMultiByte (CP_ACP, 0, wszANSI, -1, szANSI, nLen, NULL,NULL); //把unicode转成ansi
strANSI = szANSI;
delete wszANSI;
delete szANSI;
} void getXml(LPCTSTR url)
{
CFile file((TEXT("temp.xml")), CFile::modeCreate|CFile::modeWrite);
CString content;
CString data, temp;
DWORD dwStatusCode;
CInternetSession session(TEXT("HttpClient")); CHttpFile* pfile = (CHttpFile *)session.OpenURL(url);
pfile -> QueryInfoStatusCode(dwStatusCode);
if(dwStatusCode == HTTP_STATUS_OK)
{
while (pfile -> ReadString(data))
{
temp += data;
}
}
pfile -> Close();
delete pfile;
session.Close();
ConvertUTF8ToANSI(temp, content);
file.Write(content, content.GetLength());
file.Close();
} void readXml()
{
TiXmlDocument doc("temp.xml");
doc.LoadFile();
//doc.Print();
TiXmlElement* rootElement = doc.RootElement(); //xml TiXmlElement* dataElement = rootElement->FirstChildElement(); //data
for (; dataElement != NULL; dataElement = dataElement->NextSiblingElement())
{
TiXmlElement* Element = dataElement->FirstChildElement();
for (; Element != NULL; Element = Element->NextSiblingElement())
{
string Type = Element->Value();
string Value = Element->GetText();
cout << Type << " : " << Value << endl;
}
}
} int main()
{
LPCTSTR str = TEXT("http://api.kuaidi100.com/api?id=a78e61062aabe452&com=yuantong&nu=9100493541&show=1");
getXml(str);
readXml();
//system("del temp.xml");
//system("pause");
return 0;
}
需要将返回的UTF-8数据转换为string,char等都支持的ansi
void ConvertUTF8ToANSI(CString strUTF8,CString &strANSI) //
{
int nLen = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (LPCTSTR)strUTF8, -1, NULL, 0);
//返回需要的unicode长度
WCHAR *wszANSI = new WCHAR[nLen+1];
memset(wszANSI, 0, nLen * 2 + 2);
nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8, -1, wszANSI, nLen); //把utf8转成unicode
nLen = WideCharToMultiByte(CP_ACP, 0, wszANSI, -1, NULL, 0, NULL, NULL); //得到要的ansi长度
char *szANSI=new char[nLen + 1];
memset(szANSI, 0, nLen + 1);
WideCharToMultiByte (CP_ACP, 0, wszANSI, -1, szANSI, nLen, NULL,NULL); //把unicode转成ansi
strANSI = szANSI;
delete wszANSI;
delete szANSI;
}
或者利用C++11
void ConvertUTF8ToANSI()
{
auto LocUtf8 = std::locale(std::locale(""), new std::codecvt_utf8<wchar_t>);
std::wifstream wfin("temp1.xml");
std::wstring wstr, content;
wfin.imbue(LocUtf8);
while(getline(wfin, wstr))
{
content += wstr;
}
wfin.close();
system("del temp1.xml");
//std::wcout.imbue(std::locale(""));
//std::wcout << content << std::endl; std::locale::global(std::locale("Chinese-simplified"));
std::wofstream wfout("temp.xml");
wfout << content;
wfout.close();
}
寻得一个不用解码的API
http://api.ickd.cn/?id=102530&secret=dff7b12be1ae97433b2b57c74633a98d&com=shentong&nu=668456861017&type=xml
支持的常用的快递公司更多,果断换了。
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
#include <cstdlib>
#include <map>
#include <fstream>
#include <afxinet.h>
#include "tinyxml.h"
#pragma comment(lib, "tinyxml.lib")
#pragma comment(lib, "tinyxmlSTL.lib")
using namespace std; void getXml(LPCTSTR url)
{
CFile file((TEXT("temp.xml")), CFile::modeCreate|CFile::modeWrite);
CString content;
CString data;
DWORD dwStatusCode;
CInternetSession session(TEXT("HttpClient")); CHttpFile* pfile = (CHttpFile *)session.OpenURL(url);
pfile -> QueryInfoStatusCode(dwStatusCode);
if(dwStatusCode == HTTP_STATUS_OK)
{
while (pfile -> ReadString(data))
{
content += data;
}
}
pfile -> Close();
delete pfile;
session.Close();
file.Write(content, content.GetLength());
file.Close();
} void readXml(void)
{
TiXmlDocument doc("temp.xml");
doc.LoadFile();
//doc.Print();
TiXmlElement* rootElement = doc.RootElement(); //response
TiXmlElement* dataElement = rootElement->FirstChildElement("data"); //item
TiXmlElement* itemElement = dataElement->FirstChildElement(); for (; itemElement != NULL; itemElement = itemElement->NextSiblingElement())
{
TiXmlElement* Element = itemElement->FirstChildElement();
for (; Element != NULL; Element = Element->NextSiblingElement())
{
string Type = Element->Value();
string Value = Element->GetText();
cout << Type << " : " << Value << endl;
}
}
} int scan(void)
{
int n;
cout << "--------+++++++++++++++++++---------" << endl;
cout << " 请选择快递公司 " << endl;
cout << " 1.申通快递 2.圆通快递 " << endl;
cout << " 3.天天快递 4.顺丰快递 " << endl;
cout << " 5.韵达快递 6.中通快递 " << endl;
cout << " 7.EMS快递 8.宅急送 " << endl;
cout << "--------+++++++++++++++++++---------" << endl;
cin >> n;
return n;
} int main(void)
{
string nu;
string url;
int flag;
bool quit = false;
const string key("http://api.ickd.cn/?id=102530&secret=dff7b12be1ae97433b2b57c74633a98d");
map<int, string>Map;
Map[1] = "&com=shentong";
Map[2] = "&com=yuantong";
Map[3] = "&com=tiantian";
Map[4] = "&com=shunfeng";
Map[5] = "&com=yunda";
Map[6] = "&com=zhongtong";
Map[7] = "&com=ems";
Map[8] = "&com=zhaijisong"; while (!quit)
{
flag = scan();
if(flag >= 1 && flag <= 8)
{
cout << "请输入运单号:" << endl;
cin >> nu;
url = key + Map[flag] + "&nu=" + nu + "&type=xml";
//cout << url << endl;
getXml(url.c_str());
readXml();
system("del temp.xml");
}
else
{
quit = true;
}
}
return 0;
}
VC实现快递查询的更多相关文章
- 快递查询SDK
简介: 快递查询的SDK,使用的是快递100的智能查询,此SDK只是中间包装了一层而已,单对于普通的快递业务查询已经足够,也省去开发者研究的时间,拿来即用. 用途: 1.对接微信公众平台 2.对接需要 ...
- Windows Phone7 快递查询
(1)API去友商100里申请 布局代码: Exp.xaml <phone:PhoneApplicationPage x:Class="WindowsPhone_Express ...
- baidu 快递查询API
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 快递查询API接口(trackingmore)
快递查询接口 目前提供快递查询的接口平台有: Trackingmore 快递100 快递网 不同接口的区别: (1)Trackingmore支持380家快递公司,其中有55家为国内的快递,其余325家 ...
- 常用免费快递查询API对接案例
现在许多电商公司和ERP都会寻找比较适用的集成快递查询接口,减少对接难度,现在整理一下常用的免费快递查询接口,并附上调用案例,如果有觉得不对的地方,望能够一起沟通探讨! 一.快递查询接口 目前有提供免 ...
- 快递查询API接口对接方法
各类接口 快递查询API有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据.目前常用的有快递鸟.快递100.快递网等. 快递鸟即时API可以查询3 ...
- 快递查询api(多接口方案)
/** 本环境使用php+smarty,结合两种快递api调取快递数据 * 说明,先快递鸟调取数据,失败后再调取快递网的数据* 快递鸟 http://www.kdniao.com 快递网 http:/ ...
- 各种快递查询--Api接口
授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...
- Android项目---快递查询
快递查询,快递100上有更多接口信息 1.快递查询的接口是 快递公司的code值+快递单号 进行的网络查询.第一步,怎么将快递公司的名字转换成code值,传递给接口.下面是快递公司以及对应的code值 ...
随机推荐
- Linux常用命令大全(一)
Linux常用命令大全(一) 第一章 cal命令 $ cal 12 2017 :列出2017年12月的日历 $ cal 10 :列出公元10年的日历 $ cal 12 17 :列出公元17年12月的日 ...
- Go网络编程
概述 网络协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则.假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方: ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 小小知识点(二十一)如何修改PPT母版上无法直接点击修改的文字
1. 进入PPT后,选择下图右上角红色圈出的“视图”,接着选择下方红色圈出的“幻灯片母版”: 2.点击进入母版,如下图所示,最上面一栏第一个选项变成了“幻灯片母版”,在下面一栏最右边变成了“关闭母版视 ...
- pom.xml引入依赖时顺序错误而编译异常
java.lang.NoClassDefFoundError: Lorg/springframework/beans/factory/access/BeanFactoryReference; at j ...
- zookeeper作配置中心(存储支付信息)
zookeeper作配置中心(存储敏感信息) 前提:最近在项目中需要用到支付接口,支付宝或者微信支付,根据官方文档,需要配置一些诸如notify-url或者app-private-key等信息,这些信 ...
- iSO垂直滑动条VerticalSlider
由于项目需要实现一个垂直的Slider,滑动条使用UIlabel实现,按钮使用UIButton,按钮可以设置背景图片,代码如下 VerticalSlider.h // // VerticalSlide ...
- JUnit 5和Selenium基础(三)
在这一部分教程中,将介绍JUnit 5的其他功能,这些功能将通过并行运行测试,配置测试顺序和创建参数化测试来帮助减少测试的执行时间.还将介绍如何利用Selenium Jupiter功能,例如通过系统属 ...
- 基于Saltstack、Artifactory打造传统模式下持续部署平台
一.持续部署 1. 现状 由于没有建立标准的持续部署流程,导致了版本管理混乱,制品管理混乱,上线持续时间长,上线测试覆盖不全面,业务流量上升后故障较多,排查复杂.运维.测试.开发人员每次版本迭代的时候 ...
- python类型检查和类型转换
类型检查 type()用来检查值的类型 (整型.浮点型.布尔值.字符串.空值) 该函数会将检查的结果作为返回值返回,可以通过变量来接收函数的返回值 print(type(1)) # <class ...