Gsoap介绍

最近重温gsoap,发现之前的一些理解有误,这里更新一下。

gsoap客户端代码支持两种实现方式:

1>代理类
2>非代理类的方式。

gSOAP主要包括两个exe:
wsdl2h.exe的作用是根据WSDL生成C/C++风格的头文件;
soapcpp2.exe的作用是根据头文件自动生成调用远程 SOAP服务的客户端代码(称为存根:Stub)和提供SOAP服务的框架代码(称为框架:Skeleton),另外它也能从头文件生成WSDL文件。

1 用 wsdl2h.exe 是将wsdl文件翻译成为.h文件。
   wsdl2h.exe calc.wsdl    --这个命令将本地的calc.wsdl 生成 calc.h
   wsdl2h.exe http://services.xmethods.NET/soap/urn:xmethods-delayed-quotes.wsdl  --也可以是网络wsdl
   wsdl2h.exe -s -o Calc2.h calc.wsdl abcd.wsdl   --指定多个wsdl生成同一个的文件名为Calc2.h,并且不使用STL
   默认的typemap.dat 从gsoap安装包直接拷贝到wsdl2h.exe所在目录就可以了。type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写xsd__string = |   std::wstring | wchar_t*;那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更   好地支持中文。

  自己定义的type map文件可用 -t 选项来指定:  -tfile  use type map file instead of the default file typemap.dat
  如果不用-t选项,默认就用gsoap自带的type map文件 typemap.dat

常用选项:

l        -o 文件名,指定输出头文件

l        -n 名空间前缀 代替默认的ns

l        -c 产生纯C代码,否则是C++代码

l        -s 不要使用STL代码

l        -t 文件名,指定type map文件,默认为typemap.dat

l        -e 禁止为enum成员加上名空间前缀

l        -qname 将使用C++的命名空间,为所有函数指定命名空间


2 用soapcpp2.exe 利用.h文件生成客户端的代码

1>  soapcpp2  -C -x -L calc.h 

 这是非代理类的方式。这种方式会生成两个*BindingProxy.h头文件,但是不会生成cpp文件的,没有什么用的。

相关文件:
soapStub.h
从输入 Header 文件生成的经过修改且带标注的 Header 文件
soapH.h
主 Header 文件,所有客户机和服务源代码都要将其包括在内
soapC.cpp
指定数据结构的序列化器和反序列化器
soapClient.cpp
远程操作的客户机存根例程
stdsoap2.h
为stdsoap2.cpp 运行时库的 Header 文件
stdsoap2.cpp
运行时 C++ 库,带 XML 解析器和运行时支持例程
ServiceSoap11Binding.nsmap
名空间定义,客户端需要包含它


注意:stdsoap2.h 和 stdsoap2.cpp 是从gsoap包中的gsoap-2.8\gsoap 目录下直接复制的。


2> soapcpp2  -i -C -x -L calc.h 

加上-i就可以生成代理类(-j跟-i一样也可以生成代理类,细微区别是-i生成的代理类本身是从soap派生,而-j生成的代理类是将soap作为成员变量来处理),相关文件如下:
soapC.cpp,soapH.h,soapcalcProxy.cpp,soapcalcProxy.h,soapStub.h,stdsoap2.cpp,stdsoap2.h,calc.nsmap

注:

如果看到soapcpp2提示:”Critical error: #import: Cannot open file "stlvector.h" for reading.“, 那是因为我们的头文件使用了STL(wsdl2h 没用-s选项),这时要使用-I选项指定gSOAP的 import文件路径。如:

soapcpp2  -C -x -L -IC:\webservice\gsoap\gsoap-2.8\gsoap\import    calc.h 

其实用-i生成代理类和生成非代理类的代码本质没什么区别的。代理类中封装了如何去调用webservice API的,默认构造中包括了默认soap对象,直接调用代理类中封装的方法就可以了。对于非代理类,soapClient.cpp中则是API的存根,调用时要先初始化soap对象,然后作为参数传入soapClient.cpp中API的存根。


二 http和https

代理类和非代理类方式都支持http和https。
为了支持https,代理类和非代理类相关代码都必须先生成一个支持https的soap对象,代码大致如下:
/* Init OpenSSL */
soap_ssl_init();

struct soap client_soap;
soap_init(&client_soap);
soap_ssl_client_context(&client_soap,SOAP_SSL_NO_AUTHENTICATION,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);

根据此soap对象来支持https的情形大致如下:
代理类:
ServiceSoapProxy service_proxy(&client_soap);
非代理类:
soap_call___ns3__accessService(&client_soap,
            dest_url,
            NULL,
            NULL,
            &response);

除了上面的支持https的soap对象,对于代理类和非代理类代码要支持 HTTPS,还需要在编译的时候对 gSOAP 进行配置。在您的平台上安装 OpenSSL 库,以允许安全 SOAP 客户机使用 HTTPS/SSL。安装完成后,在应用程序工程中添加宏WITH_OPENSSL选项来让gSOAP打开对OpenSSL的支持。然后只需要编译应用程序的所有源文件就可以了。
具体步骤可参考:
https://www.ibm.com/developerworks/cn/webservices/ws-soa-gsoap/

三 代理类和非代理类

参见http://www.cs.fsu.edu/~engelen/soap.html 可知非代理类的方式是一个比较老的使用方式,现在官方推荐使用代理类的方式。

without the -i option only old-style service proxies and objectsare generated, which are less flexible and no longer recommended.


四  gsoap支持汉字

如果gsoap要支持汉字,则要执行gsoap为utf8编码,然后在设置soap接口参数之前,都要把字符转换为utf8格式。Web service API接口接收的也是utf8字符串,程序中需要按照需要,将收到的utf8字符串转换为所需要的格式。
soap_init(&client_soap);

soap_set_mode(&client_soap,SOAP_C_UTFSTRING);


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gSOAP是一个用于开发基于SOAP(Simple Object Access Protocol)的Web服务的工具包。它最初是为C和C++开发的,但也提供了Python的绑定。 要在Python中使用gSOAP,您需要执行以下步骤: 1. 安装gSOAP:首先,您需要从gSOAP的官方网站下载并安装gSOAP工具包。根据您的操作系统,选择合适的版本进行安装。 2. 生成SOAP客户端和服务器代码:使用gSOAP工具包提供的命令行工具,根据您的Web服务定义(通常是使用WSDL描述的),生成相应的SOAP客户端和服务器代码。例如,可以使用`soapcpp2`命令生成C++代码,然后使用`wsdl2h`和`soapcpp2`命令生成C和C++代码。 3. 使用Python绑定:gSOAP提供了Python绑定,使您可以在Python中使用SOAP客户端和服务器。您可以使用`swig`工具为生成的C或C++代码生成Python绑定。然后,将生成的绑定文件编译为Python模块。 4. 开发和使用Python代码:一旦您完成了上述步骤,您就可以在Python中编写代码来使用gSOAP生成的SOAP客户端和服务器。您可以调用相应的函数来执行SOAP调用和处理返回结果。 需要注意的是,使用gSOAP进行Python开发需要一些额外的工作,并且涉及到多个步骤。因此,在决定使用gSOAP之前,建议先评估您的项目需求,以确定是否真正需要使用SOAP和gSOAP。在许多情况下,使用更简单的RESTful API或其他Web服务技术可能更加合适和方便。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值