最近有个项目涉及到客户端程序调用webservice服务。java,perl对应的可以选择Axis和SoapLite,但是语言限制在c++。
候选方案有几个:
1. gsoap
这个是最终选择,简单,强大,借鉴最多。
2. qsoap
号称qt内置的soap服务,在qt4.8中没发现。
3.soappy
这种方法是基于python,然后c++调用python。
http://www.osow.org/wiki/Python_SOAP%E5%BA%935
http://hi.baidu.com/moatlzy/blog/item/f5fafefe8c1b5b89b901a093.html
http://hi.baidu.com/moatlzy/blog/item/80dfa08d60f4d9f1503d9267.html
gsoap方法:
1.生成头文件:
在新建程序根目录下建立一个文件夹gsoap,名称随意主要考虑生成的soap文件较多单独存放易于管理。本机的路径为:D:\work\gSoapWebService\client\gsoap
并把D:\QtDev\gsoap-2.8\gsoap目录下的stdsoap2.cpp和stdsoap2.h拷贝至刚刚建立的gsoap文件夹下,还有D:\QtDev\gsoap-2.8\gsoap\import下的stlvector.h。
在CMD窗口定位到这个文件夹,执行命令,由WSDL生成头文件:
wsdl2h -I "D:\work\psdbClinet\psdbClinet\PSDsoap/WS" -o psdbClinetSoap.h http://172.16.35.12:8088/psdb/services/adduser?wsdl http://localhost:36898/WebSite/DownlodeService.asmx?WSDL
程序要连接两个服务,所以在命令中都包了进去,生成的头文件名称为psdbClinetSoap.h。
保存在cmd所在的目录下,psdbClinetSoap.h 文件名称是随意起的。
然后执行名称生成相关的soap文件
soapcpp2 -I "D:/QtDev/soap-2.8/gsoap/import" psdbClinetSoap.h
注意:编码的时候不能用默认的std::string而要用wstring宽字符,这样可以彻底解决中文乱码。试过N多方法,这个方法最彻底。
#include "gsoap/soapC.cpp"
#include "gsoap/soapClient.cpp"
#include "gsoap/stdsoap2.cpp"
#include "PSDsoap/soapadduserHttpBindingProxy.h"
#include "PSDsoap/adduserHttpBinding.nsmap"
bool CsoapUser::delUser( const std::string& strUser )
{
//定义请求服务
_ns1__DelUser req;
_ns1__DelUserResponse res;
req.in0 = const_cast<std::string*>(&strUser);
if (m_usoap->__ns1__DelUser(&req,&res) != SOAP_OK)
return false;
return res.out;
}
后记:
执行效率,开发速度,可维护性让人很满意。
不爽的就是服务器的接口变动后,要重新生成c++文件,之前在生成文件上的修改要覆盖掉。
更好的解决方案待续。