用gSOAP调用Web Services

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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文件里面,比如放在

相关文档
最新文档