大体思路是:使用gsoap生成文件,把生成的相关文件均加载到项目中调用
本文以调用天气的webservice为例子,手把手教你。
步骤一
准备gSOAP工具:将gsoap_2.8.100.zip解压,进入gsoap_2.8.100\gsoap-2.8\gsoap\bin\win32目录下,或win64目录下。(工具可以在这个网址下载:图1. 解压后要进入的目录
步骤二
打开链接是这个样子:图2. xml文件
右击这网页,选择“另存为”到win32目录下,直接把文件名后缀改成.wsdl,如下:图3. 另存为文件后的目录
步骤三
在win32目录下新建一个文件”wsmp.dat“,文件内容为xsd__string = | std::wstring | wchar_t*图4. wsmap.dat
那么SOAP/XML中的string将转换成std::wstrin或wchar_t*,这样能更好地支持中文。
步骤四
在该目录下打开cmd窗口,输入以下命令。回车后WeatherWS.h头文件
wsdl2h -s -t wsmap.dat WeatherWS.wsdl-o 文件名,指定输出头文件
-n 名空间前缀 代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上名空间前缀
步骤五
解析WeatherWS.h,生成存根程序
在该目录下打开cmd窗口,输入以下命令。
soapcpp2 -i -C -x -L WeatherWS.h -I D:\gsoap_2.8.108\gsoap-2.8\gsoap\import
注意D:\gsoap_2.8.108\gsoap-2.8\gsoap\import是我的路径,根据你的路径来变。
此时会生成6个文件,如下图:
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定import路径(此项是必要的,因前面为指定-s)
-x 不要产生XML示例文件
-i生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
步骤六
打开Visual Studio 2017,在里面新建一个空项目。我在这里命名为“TestWebservice”。
将文件复制到vs的项目目录下,选择“添加现有项”,添加好的样子如下:
其中的stdsoap2.h和stdsoap2.cpp在gsoap_2.8.100\gsoap-2.8\gsoap目录下
在“源文件”目录下,右击新建一个.cpp文件添加main函数。空项目默认啥都没有。
#include #include #include #include < string >#include
#include //包含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;
//调用接口方法getWeatherint 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();
}
错误修改
会有红色下划线错误提示错误提示
右击项目“属性”->c/c++->语言->符合模式,改成否。如下图:
最后的结果最后输出
原创不易,欢迎评论,并点赞!!
Enjoy!!!