C++客户端 如何通过gsoap调用WebService接口(以及返回结果乱码解决办法)

来源:互联网 发布:网络大电影发行流程 编辑:程序博客网 时间:2024/06/07 05:04

项目里遇到要调用webService接口的地方,网上找了一下gsoap还是比较方便通用,所以总结一下使用的方法,方便下次调用。


1. 要下载gsoap版本。网上很多,连接就不附上链接了,我这里用的版本是gsoap_2.8.19

2. 用cmd命令进入到目录下的gsoap\bin\win32 下,

调用 wsdl2h .exe生成头文件格式如下:

wsdl2h   参数  头文件  webService的路径 如

 wsdl2h.exe -o test.h http://www.cs.fsu.edu/~engelen/calc.wsdl,

参数说明:

-o 文件名,指定输出头文件
-n 名空间前缀 代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上名空间前缀
type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写xsd__string = | std::wstring | wchar_t*
那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文

3. 从头文件中生成存根程序文件

在此之前,现将gsoap\import\ 下stlvector.h拷贝到当前目录,因为默认使用时STL的所以需要。

使用soapcpp2 生成存根程序文件,格式: soapcpp2  参数 头文件

soapcpp2.exe -L -x -C -I D:\gsoap-2.8\gsoap\import test.h -i

-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定imp<wbr>ort路径(见上文) </wbr>
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
这里一般需要带上-x,不然会生成一大堆的xml文件。
-i选项也要带上,不然不会生成soapXXXXBindingService.cpp和soapXXXXBindingService.h文件
-I 选项一般也要带上,-I 后接gsoap路径中import目录
一般是-I E:\workspace\onvif\gsoap-2.8\gsoap\import;E:\workspace\onvif\gsoap-2.8\gsoap这样的

区分大小写很重要,本人在这里耗费了不少时间。

生成如下文件:


连同import文件夹下的stlvector.h、 stdsoap2.h、stdsoap2.cpp一起加入到客户端工程中。

4、调用webService接口

取消soapC.cpp,soapClient.cpp,stdsoap2.cpp这三个文件的预编译头, 工程包含#include "soapXXXProxy.h"
#include "XXX.nsmap"  文件, 然后再具体调用:

XXXProxy service;

ns1__Request request;

request.arv1 = "XXX";

request.arv2 = "XXX";

...

ns1__Response response;

service.接口1(&request, response);

具体参数按接口定义来。调用完毕, 就这么简单。还是比较实用的

PS: 如果返回结果显示中文乱码的话,解决方法如下:

1、在合适的位置设置中文码: 

//936是简体中文的代码页, 

std::locale loc1 = std::locale::global(std::locale(".936"));

2、XXXProxy service(SOAP_C_MBSTRING);  //设置soap模式

其他解决方法网上也有,不过个人感觉这种比较简单。

PS2: 设置soap超时时间(单位:s),直接在proxy类的构造中添加就可以.

accept_timeout = 10 ; 
send_timeout = 20 ; 
recv_timeout = 20 ;




0 0