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++文件,之前在生成文件上的修改要覆盖掉。

 

更好的解决方案待续。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值