gsoap使用
查了很多资料,主要还是参考了这个片文章
http://panxq0809.iteye.com/blog/709173
很多都是照猫画虎,主要是最后的乱码问题
调用的webservice连接是
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
将网页另存为WeatherWebService.wsdl
运行命令
wsdl2h -o WeatherWebService.h WeatherWebService.wsdl
soapcpp2 -i -C -x WeatherWebService.h -ID:\gsoap-2.8\gsoap\import
这2个命令在 D:\gsoap-2.8\gsoap\bin\win32 下
将生成的文件一并添加到工程,可能有的提示无法生成,不用管,将gSoap下的stdsoap2.h,stdsoap2.cpp也添加到工程
最后将使用预编译头的选项去掉,生成。
废话不多说,直接上代码
// WeatherTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "WeatherWebServiceSoap.nsmap"
#include "soapWeatherWebServiceSoapProxy.h"
int _tmain(int argc, _TCHAR* argv[])
{
_ns1__getSupportCity city;
_ns1__getSupportCityResponse cityRespone;
_ns1__getWeatherbyCityName weather;
_ns1__getWeatherbyCityNameResponse weatherRespone;
WeatherWebServiceSoapProxy proxy("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx", SOAP_C_UTFSTRING);
//std::string arg1("54765");
std::string arg1("");
std::vector<std::string>::iterator iter;
if(argc != 2 || _tcscmp(argv[1], _T("-h")) == 0 || _tcscmp(argv[1], _T("/h")) == 0){
printf("使用方法: WeatherTest [城市名]\r\n");
return 0;
}
char* pBuf = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 4096);
if(pBuf == NULL){
printf("申请缓冲区失败!\r\n");
goto err_exit;
}
TCHAR* pBufT = (TCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 4096);
if(pBufT == NULL){
printf("申请缓冲区失败!\r\n");
goto err_exit;
}
city.soap = &proxy;
city.byProvinceName = &arg1;
if(SOAP_OK != proxy.getSupportCity_(&city, &cityRespone)){
printf("获取城市列表失败\r\n");
goto err_exit;
}
for(iter = cityRespone.getSupportCityResult->string.begin();
iter != cityRespone.getSupportCityResult->string.end();
iter++)
{
size_t nn = iter->length();
if(nn> 2040){
HeapFree(GetProcessHeap(), 0, pBuf);
pBuf = NULL;
HeapFree(GetProcessHeap(), 0, pBufT);
pBufT = NULL;
pBuf = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nn+10);
if(pBuf == NULL){
printf("申请缓冲区失败!\r\n");
return 0;
}
pBufT = (TCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nn+10);
if(pBufT == NULL){
printf("申请缓冲区失败!\r\n");
return 0;
}
}
memset(pBuf, 0, 4096);
memset(pBufT, 0, 4096);
MultiByteToWideChar(CP_UTF8, 0, iter->c_str(), nn, (WCHAR*)pBufT, nn+4);
// 将UTF-8转换成UNICODE
WideCharToMultiByte(CP_ACP, 0, (WCHAR*)pBufT, nn, (CHAR*)pBuf, nn+4, NULL, NULL);
// 将UNICODE转换成GB2312还是GBK就不清楚了
if(_tcsncmp(pBufT, argv[1], _tcslen(argv[1])) == 0){
//printf(pBuf);
int xx = strlen(pBuf);
char* p1 = pBuf;
char* p2 = pBuf;
while(xx && *p2 != '('){
p2++;
xx--;
}
if(!xx || *p2 != '('){
return 0;
}
p1 = p2+1;
while(xx && *p2 != ')'){
p2++;
xx--;
}
if(!xx || *p2 != ')'){
return 0;
}
*p2 = 0;
arg1 = p1;// 找到城市对应码,以此来取得天气信息
break;
}
}
if(arg1 == ""){
size_t nn = _tcslen(argv[1]);
if(nn > 2040){
nn = 2040;
}
memset(pBuf, 0, 4096);
memset(pBufT, 0, 4096);
WideCharToMultiByte(CP_ACP, 0, (WCHAR*)argv[1], nn, (CHAR*)pBuf, nn*2+2, NULL, NULL);
// 将UNICODE转换成GB2312还是GBK就不清楚了
printf("找不着城市:%s\r\n", pBuf);
goto err_exit;
}
weather.soap = &proxy;
weather.theCityName = &arg1;
if(SOAP_OK != proxy.getWeatherbyCityName_(&weather, &weatherRespone)){
printf("获取城市信息失败\r\n");
goto err_exit;
}
for(iter = weatherRespone.getWeatherbyCityNameResult->string.begin();
iter != weatherRespone.getWeatherbyCityNameResult->string.end();
iter++)
{
size_t nn = iter->length();
if(nn> 2040){
HeapFree(GetProcessHeap(), 0, pBuf);
pBuf = NULL;
HeapFree(GetProcessHeap(), 0, pBufT);
pBufT = NULL;
pBuf = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nn+10);
if(pBuf == NULL){
printf("申请缓冲区失败!\r\n");
return 0;
}
pBufT = (TCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nn+10);
if(pBufT == NULL){
printf("申请缓冲区失败!\r\n");
return 0;
}
}
memset(pBuf, 0, 4096);
memset(pBufT, 0, 4096);
MultiByteToWideChar(CP_UTF8, 0, iter->c_str(), nn, (WCHAR*)pBufT, nn+4);
// 将UTF-8转换成UNICODE
WideCharToMultiByte(CP_ACP, 0, (WCHAR*)pBufT, nn, (CHAR*)pBuf, nn+4, NULL, NULL);
// 将UNICODE转换成GB2312还是GBK就不清楚了
std::cout << pBuf << std::endl;
//std::cout << *iter << std::endl;
}
err_exit:
if(pBuf){
HeapFree(GetProcessHeap(), 0, pBuf);
pBuf = NULL;
}
if(pBufT){
HeapFree(GetProcessHeap(), 0, pBufT);
pBufT = NULL;
}
return 0;
}
浙公网安备 33010602011771号