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);



gsoap官网 http://www.cs.fsu.edu/~engelen/soap.html 是学习的宝库


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。   gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。   gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它   来为你的web服务生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。   下面是gSOAP的一些特点:   ×gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。   ×gSOAP支持WSDL 1.1, SOAP 1.1, SOAP 1.2, SOAP RPC 编码方式以及 literal/document 方式.   ×gSOAP是少数完全支持SOAP1.1 RPC编码功能的工具包,包括多维数组及动态类型。比如,一个包含一个基类参数的远程方法可以接收客户端   传来的子类实例。子类实例通过动态绑定技术来保持一致性。   ×gSOAP 支持 MIME (SwA) 和 DIME 附件包。   ×gSOAP是唯一支持DIME附件传输的工具包。它允许你在保证XML可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据   。   ×gSOAP 支持 SOAP-over-UDP。   ×gSOAP 支持 IPv4 and IPv6.   ×gSOAP 支持 Zlib deflate and gzip compression(for HTTP, TCP/IP, and XML file storage)。   ×gSOAP 支持 SSL (HTTPS)。   ×gSOAP 支持 HTTP/1.0, HTTP/1.1 保持连接, 分块传输及基本验证。   ×gSOAP 支持 SOAP 单向消息。   ×gSOAP 包含一个 WSDL 生成器,便于web服务的发布。   ×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。   ×生成可以单独运行的web服务及客户端程序。   ×因为只需要很少内存空间,所以可以运行在类似Palm OS, Symbian, Pocket PC的小型设备中。   ×适用于以C或C++开发的web服务中。   ×跨平台:Windows, Unix, Linux, Mac OS X, Pocket PC, Palm OS, Symbian等。   ×支持序列化程序中的本地化C/C++数据结构。   ×可以使用输入和输出缓冲区来提高效率,但是不用完全消息缓冲来确定HTTP消息的长度。取而代之的是一个三相序列化方法。这样,像64位   编码的图像就可以在小内存设备(如PDA)中以DIME附件或其他方式传输。   ×支持C++单继承,动态绑定,重载,指针结构(列表、树、图、循环图,定长数组,动态数组,枚举,64位2进制编码及16进制编码)。   ×不需要重写现有的C/C++应用。但是,不能用unions,指针和空指针来作为远程方法调用参数的数据结构中元素。   ×三相编组:1)分析指针,引用,循环数据结构;2)确定HTTP消息长度;3)将数据序列化位SOAP1.1编码方式或用户定义的数据编码方式。   ×双相编组:1)SOAP解释及编码;2)分解“forward”指针(例如:分解SOAP中的href属性)。   ×完整可定制的SOAP错误处理机制。   ×可定制的SOAP消息头处理机制,可以用来保持状态信息   2 gSoap2.2版与gSOAP 2.1版(或以前版本)的不同   如果你是从2.1版升级到2.2或以后版本,请注意这些变化。   为了能够分离传输、内容编码、映射中的接收/发送设置,改变了运行时选项及标志。这些标志分布再四个类中:传输(IO),内容编码(ENC   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值