目录
一、WebService介绍
基础知识了解:
Webservice:Web Services 可使应用程序成为 Web 应用程序,Web Services 通过 Web 进行发布、查找和使用。
WSDL:网络服务描述语言,是一门基于 XML 的语言
SOAP:简单对象访问协议
XML:可扩展标记语言
HTTP:超文本传输协议
一、gSoap下载
gSoap下载地址: https://sourceforge.net/projects/gsoap2
下载后是一个压缩包:gsoap_2.8.133.zip,解压得到gsoap-2.8一个文件夹,需要用到的是:
- gsoap-2.8\gsoap\bin 目录下有win32和win64可选则,需要其中的
soapcpp2.exe
和wsdl2h.exe
来编译WebService接口生成代码文件.h&.cpp等 - gsoap-2.8\gsoap\import 的目录
路径
用来做编译参数
- gsoap-2.8\gsoap\stdsoap2.cpp 在使用gSoap时需要
添加到项目中
- gsoap-2.8\gsoap\stdsoap2.h 在使用gSoap时需要
添加到项目中
- gsoap-2.8\gsoap\typemap.dat 用来做编译参数,具体作用未深究,感兴趣的朋友可以研究一下
二、使用gSoap编译wsdl文件实现WebService接口,生成代码
步骤1
将上述文件拷贝到一个新的目录下,即工作目录
我使用的是win64版本的exe
步骤2: 获取.wsdl
文件
以天气预报服务为例,网页搜索:http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
是一个xml格式的文档,保存到本地工作目录
下:WeatherWS.xml
或WeatherWS.wsdl
文件。
步骤3:
打开cmd命令框,cd进入到工作目录
下
步骤4: 使用wsdl2h.exe
生成WebService的头文件
cmd命令: wsdl2h.exe -o myWebService.h -t typemap.dat WeatherWS.xml
执行结果: myWebService.h为生成的文件,用来执行soapcpp2命令生成代码文件
soapcpp2.exe 命令参数:
- -o 文件名,指定输出头文件
- -n 名空间前缀 代替默认的ns
- -c 产生纯C代码,否则是C++代码
- -s 不要使用STL代码
- -t 文件名,指定type map文件,默认为typemap.dat
- -e 禁止为enum成员加上名空间前缀
步骤5: 使用soapcpp2.exe
命令生成代码文件
cmd命令: soapcpp2.exe -C -L -I D:\gsoap_2.8.108\gsoap-2.8\gsoap\import myWebService.h
执行结果: 生成接口xml文件,以及代码文件:soapH.h、soapStub.h、soapC.cpp、soapClient.cpp、WeatherWSSoap.nsmap等文件。
soapcpp2.exe 命令参数:
- -C 仅生成客户端代码
- -S 仅生成服务器端代码
- -L 不要产生soapClientLib.c和soapServerLib.c文件
- -c 产生纯C代码,否则是C++代码(与头文件有关)
- -I 指定import路径(此项是必要的,因前面为指定-s)
- -x 不要产生XML示例文件
- -i生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
其中 -I 命令的路径D:\gsoap_2.8.108\gsoap-2.8\gsoap\import 为前面提到的gsoap的import文件夹路径,也可以将import文件夹复制到工作目录
中,则soapcpp2命令的 -I 参数为 import,例:soapcpp2.exe -C -L -I import myWebService.h
步骤5: 将.h和.cpp加入到项目中
生成的文件:soapH.h、soapStub.h、soapC.cpp、soapClient.cpp
soap文件:stdsoap2.h、stdsoap2.cpp
共6个文件加入工程中。
三、使用接口,两种使用方式
在使用接口的.cpp文件中包含.nsmap
文件(必须包含,否则编译不通过):
#include “XXXSoap.nsmap”
- 方式1:若使用-i命令生成C++包装,使用方式如下:
#include <iostream>
//包含soap头文件
#include "soapH.h"
#include "soapStub.h"
#include "WeatherWSSoap.nsmap"
#include "soapWeatherWSSoapProxy.h"
using namespace std;
void main(int argc, char **argv)
{
//WebService的请求地址
const char* web_url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
//soap接口
WeatherWSSoapProxy soap(SOAP_C_UTFSTRING);
//构造输入参数
_ns1__getWeather city_name;
city_name.theCityCode = L"";
city_name.theUserID = L"";
//输出参数
_ns1__getWeatherResponse weather_res;
//调用接口方法getWeather
int xlt = soap.getWeather(web_url, NULL, &city_name, weather_res);
//判断接口返回值, SOAPOK表示成功
if (xlt == SOAP_OK)
{
// 获取返回结果
ns1__ArrayOfString* aos = weather_res.getWeatherResult;
// 打印返回结果
int count = aos->__sizestring;
for (int i = 0; i < count; i++)
{
std::wstring a = (aos->string)[i];
wcout.imbue(locale("chs"));
wcout << a.c_str() << endl;
}
}
getchar();
}
- 方式2:
待续...
//使用接口
注意事项
:
- 此处天坑:在将soapH.h、soapStub.h、stdsoap.h、soapC.cpp、soapClient.cpp、stdsoap2.cpp添加到工程中时,若只将这写文件加入工程中后,大概率会出现
编译不通过
的情况,必须需要将对应生成的".nsmap"
包含到使用soap接口的cpp
文件中(必须时cpp文件,否则还是编译不通过
),如:#include "XXXSoap.nsmap"
- 包含中文,c++中需要处理宽字符
- Qt中提交接收到的数据都需要转为utf8编码格式
四、Qt使用QNetworkAccessManager的POST调用WebService,访问soap
直接使用http POST请求访问WebService服务
以天气预报WeatherWS.xml为例:
//post
待续...
五、使用QtSoap调用WebService,访问soap
待续...
四、20个免费的Webservice接口
20个免费webservice接口:http://t.csdnimg.cn/RCCRQ
天气预报Web服务,数据来源于中国气象局
Endpoint
Disco
WSDL
天气预报Web服务
Endpoint
Disco
WSDL
股票行情数据 WEB 服务(支持香港、深圳、上海基金、债券和股票;支持多股票同时查询)
Endpoint
Disco
WSDL