soap C++

最近有个项目涉及到客户端程序调用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多方法,这个方法最彻底。


2. 主函数main.cpp引用

仅添加引用文件,引用文件名称固定。
#include "gsoap/soapC.cpp"
#include "gsoap/soapClient.cpp"
#include "gsoap/stdsoap2.cpp"
3. 
功能实现.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;
}
 
这几行有怪异命名的程序就是调用的全部。先定义请求服务和服务返回变量req,res,这是必须定义的。在请求变量中绑定传递的参数。 m_usoap->__ns3__getdata即是调用服务中的getdata方法。前缀名称可以在上一步中通过命令控制。
注意:通过!= SOAP_OK判断调用是否成功,返回结果要判断是否为空指针。

 

 

 

 

后记:

执行效率,开发速度,可维护性让人很满意。

不爽的就是服务器的接口变动后,要重新生成c++文件,之前在生成文件上的修改要覆盖掉。

 

更好的解决方案待续。

 

你可能感兴趣的:(SOAP)