用gSOAP调用Web Services
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用gSOAP调用Web Services
1、配置gSOAP
从/project/showfiles.php?group_id=52781 下载gSOAP,解压后在gsoap\bin\win32里找到wsdl2h.exe 和soapcpp2.exe程序。通过这两个程序可以生成客户端需要的C/C++文件。这两个程序的使用方法:
wsdl2h.exe: 编译wsdl文件生成c/c++头文件
-o 文件名,指定输出头文件
-n 名空间前缀代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上名空间前缀
soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的c/c++文件
(如果使用STL,需要从压缩包里找到stlvector.h放到soapcpp2.exe目录下,否则运行失败)
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定import路径(见上文)
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)
我写了个批处理:
wsdl2h -o xxxService.h "WSDL文件URL"
soapcpp2 -C xxxService.h
如果是asmx,可以在URL后加"?WSDL" 来获取WSDL文件,它是一个XML,用来描述接口,它是与语言无关的,类似COM的IDL文件。
2、创建VC工程,把生成的文件拷到工程目录
生成的文件有:
soapStub.h 从输入Header 文件生成的经过修改且带标注的Header 文件
soapH.h 主Header 文件,所有客户机和服务源代码都要将其包括在内
soapC.c 指定数据结构的序列化器和反序列化器
soapClient.c 远程操作的客户机存根例程
stdsoap2.h stdsoap2.cpp 运行时库的Header 文件
stdsoap2.cpp 运行时C++ 库,带XML 解析器和运行时支持例程
创建一个控制台工程:把上面的几个文件加到工程;
为soapC.c、soapClient.c 和stdsoap2.cpp 选择Not using precompiled headers,因为它们并不依赖于stdafx.h。加入wsock32.lib库,这时编译会出现_namespace错误,包含两个文件就可以:
#include "soapServiceSoapProxy.h"
#include "ServiceSoap.nsmap"
3、调用Web服务:
比如服务有个String getContext(string userName); 接口,我们要怎么调用它:string username = "heng" ;
_ns1__getContext getContext ; // 调用接口
_ns1__getContextResponse getContextResponse ; // 用来接收
返回值struct soap soap;
soap_init(&soap);
erName = &username ; // 传入string userNameusing namespace std; 大功造成!
int result = soap_call___ns2__getContext(&soap, NULL, NULL, &getContext, &getContextResponse ) ;
if(result == SOAP_OK)
{
cout<<"Result:
"<<getContextResponse.getContextResult->c_str()
<<endl; // 查看返回值
}
else
{
cout<<"Fail!"<<endl;
}补充,因为用到STL,再加上
#include <string>
另一个版本的!(基于gsoap-win32-2.7版本,编译环境为
VS2005)
客户端
访问自己定义的一个WebService(命名为AddService,对输入的两个整形参数求和,具体服务定义参见
AddService.wsdl)
转换WSDL
wsdl2h.exe -s -o AddService.h AddService.wsdl
生成具体调用代码
在命令行输入soapcpp2.exe -C AddService.h
生成代码后,AddService.h就没有用了,不用加入到工程中。生成的文件
soapStub.hsoapAddServiceSoapBindingProxy.h:封装了调用webservice的类soapH.hsoapClientLib.cpp:用不到soapClient.cppsoapC.cppAddServiceSoapBinding.nsmap:namespaces声明,需要包含在一个cpp文件里面,比如放在