gsoap, wsdl2h, soapcpp2

http://www.cs.fsu.edu/~engelen/soapdoc2.html

http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.22


gSOAP一种跨平台的C和 C++软件开发工具包。生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的具体架构解析器,它们都受益于一个XML接口。 这个工具包提供了一个全面和透明的XML数据绑定解决方案,Autocoding节省大量开发时间来执行SOAP/XML Web服务中的C/C++。此外,使用XML数据绑定大大简化了XML自动映射。应用开发人员不再需要调整应用程序逻辑的具体库和XML为中心的数据,如 交涉DOM。


功能和特点
可移植性:gSOAP支持大多 数平台,包括嵌入式系统和小系统(例如嵌入式Symbian,Palm)。可移植性测试Windows(98,XP,Vista),Linux,Unix 系统,Mac OS X,Solaris,HP-UX,AIX,FreeBSD,TRU64,Irix,QNX,VxWorks。
稳定性:该软件已经成熟。自2001年以来经过几年的发展和试验。许多工业项目和产品都在使用该软件。
广泛的用户群:自2003年以来超过150000次下载,成千上万许可证/支持协议的公司,其中包括一些财富100强企业。
所有功能于一身的软件包:独立第三方工具和库确保可靠的运行执行。
开源:可选择自由和商业许可。
C和C++的支持:支持纯粹的ANSI C和混合的C/C++应用开发。
综合XML数据绑定: gSOAP是唯一的SOAP/XML工具包,支持一个纯粹的本地的C/C++数据绑定到XML。该工具包是以自动序列指针为基础的数据结构。

行业标准协议: SOAP 1.1/1.2  WSDL 1.1,v2和UDDI 。支持XML架构原始XSD结构类型等等。
传 输:HTTP/S, TCP, UDP, MIME (SwA), DIME (streaming), MTOM (streaming), HTTP1.0/1.1, IPv4, IPv6, RSS, XML-RPC, WS-Addressing, WS-Enumeration等
安全:HTTPS和WS安全性:认证令牌,数字签名。

速度:架构特定的编译器生成的代码速度快。基准测试表明速度优于最快的XML解析器。
占用内存小:客户端应用程序总运行内存占用很小。内存管理使用垃圾收集,可以自动清理。 
许多例子:软件包,包括许多代码范例,其中包括独立的HTTP/1.1和HTTPS安全的Web服务器。
Web服务器整合:包括Apache_mod, IIS, WinInet, CGI, FastCGI。


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可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据


gSOAP2.0及之后的版本是在1.x版基础上重写的。gSOAP2.0之后的版本是线程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已经重新
  命名,以便与1.x版区分。
  gSOAP 1.X gSOAP 2.X
  soapcpp soapcpp2
  soapcpp.exe soapcpp2.exe
  stdsoap.h stdsoap2.h
  stdsoap.c stdsoap2.c
  stdsoap.cpp stdsoap2.cpp

        soap_init(struct soap *soap) 初始化环境变量(只需执行一次)
  struct soap *soap_new() 定义并初始化环境变量并返回一个该变量的指针
  struct soap *soap_copy(struct soap *soap) 定义一个环境变量并从已有的环境变量中拷贝环境信息


The wsdl2h WSDL/schema importer and data binding mapper tool.

  • 只负责生成头文件,且此头文件不能直接使用,必须在经过soapcpp2转换后才能使用。
  • 输入为一个或多个wsdl或xsd文件,或URL;
  • 如果输入为wsld或xsd文件,默认输出为第一个文件名,后缀为.h。
  • 如果输入为URL,则默认输出为标准输出。

wsdl2h的参数含义:
case 'h':
     fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c] [-d] [-e] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-l] [-m] [-N name] [-n name] [-P|-p] [-q name] [-r proxyhost[:port[:uid:pwd]]] [-s] [-t typemapfile] [-u] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n");
            fprintf(stderr, "\
-a      generate indexed struct names for local elements with anonymous types\n\
-b bi-directional operations (duplex ops) to serve one-way response messages\n\
-c      generate C source code\n\ ------默认为生成C++头文件,此参数保证生成C头文件。
-d      use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\
-e      don't qualify enum names\n\
-f      generate flat C++ class hierarchy\n\
-g      generate global top-level element declarations\n\
-h      display help info\n\
-Ipath  use path to find files\n\
-i      don't import (advanced option)\n\
-j      don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\
-k      don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\
-l      display license information\n\
-m      use xsd.h module to import primitive types\n\
-Nname  use name for service namespace prefixes and multiple bindings\n\
-nname  use name as the base namespace prefix instead of 'ns'\n\
-ofile  output to file\n\ ---指定输出文件
-P      don't create polymorphic types inherited from xsd__anyType\n\
-p      create polymorphic types inherited from base xsd__anyType\n\
-qname  use name for the C++ namespace of all declarations\n\ --- 定义名字空间
-rhost[:port[:uid:pwd]]\n\
        connect via proxy host, port, and proxy credentials\n\
-s      don't generate STL code (no std::string and no std::vector)\n\
-tfile  use type map file instead of the default file typemap.dat\n\ 

—— typemap.dat包含信息,如SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"

xsi="http://www.w3.org/2001/XMLSchema-instance"

xsd="http://www.w3.org/2001/XMLSchema"

-u      don't generate unions\n\
-v      verbose output\n\
-W      suppress warnings\n\
-w      always wrap response parameters in a response struct (<=1.1.4 behavior)\n\
-x      don't generate _XML any/anyAttribute extensibility elements\n\
-y      generate typedef synonyms for structs and enums\n\
-z1     compatibility with 2.7.6e: generate pointer-based arrays\n\
-z2     compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\
-z3     compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\
-z4     compatibility up to 2.8.11: don't generate union structs in std::vector\n\
-_      don't generate _USCORE (replace with UNICODE _x005f)\n\
infile.wsdl infile.xsd http://www... list of input sources (if none: use stdin)\n\
\n");

wsdl2h -qsoap_cm -o soap_cmServiceC.h -d -u wsdl/32607-703.wsdl -c -t wsdl/typemap.dat
wsdl2h -qsoap_cm -o soap_cmService.h -d -u wsdl/32607-703.wsdl  -t wsdl/typemap.dat



The soapcpp2 stub/skeleton compiler and code generator.
soapcpp2的参数:
case 'h':
     fprintf(stderr, "Usage: soapcpp2 [-1|-2|-0] [-C|-S] [-T] [-L] [-a] [-A] [-b] [-c] [-d path] [-e] [-f N] [-h] [-i] [-I path"SOAP_PATHSEP"path"SOAP_PATHSEP"...] [-k] [-l] [-m] [-n] [-p name] [-s] [-t] [-u] [-v] [-w] [-x] [-y] [infile]\n\n");
fprintf(stderr, "\
-1      generate SOAP 1.1 bindings\n\
-2      generate SOAP 1.2 bindings\n\
-0      remove SOAP bindings (when not explicitly set by directives)\n\
-C generate client-side code only\n\
-S generate server-side code only\n\
-T generate server auto-test code\n\
-L don't generate soapClientLib/soapServerLib\n\
-a use SOAPAction with WS-Addressing to invoke server-side operations\n\
-A require SOAPAction to invoke server-side operations\n\
-b serialize byte arrays char[N] as string\n\
-c      generate C source code\n\
-dpath  use path to save files\n\
-e generate SOAP RPC encoding style bindings\n\
-fN file split of N XML serializer implementations per file (N>=10)\n\
-h display help info\n\
-Ipath  use path(s) for #import (paths separated with '"SOAP_PATHSEP"')\n\
-i      generate C++ service proxies and objects inherited from soap struct\n\ --- 生成对象为soap的子类,会影响生成文件的使用方法

如namespace soap_cm {
class SOAP_CMAC BasicCMIRPService : public soap

-j      generate C++ service proxies and objects that share a soap struct\n\
-k      generate data structure walkers (experimental)\n\
-l      generate linkable modules (experimental)\n\ --- 此文件夹为gsoap的import文件夹
-m      generate Matlab(tm) code for MEX compiler\n\
-n      use service name to rename service functions and namespace table\n\
-pname  save files with new prefix name instead of 'soap'\n\
-Qname  use name as the C++ namespace for decls, including custom serializers\n\
-qname  use name as the C++ namespace for decls, excluding custom serializers\n\
-s      generate deserialization code with strict XML validation checks\n\
-t      generate code for fully xsi:type typed SOAP/XML messaging\n\
-u uncomment comments in WSDL/schema output by suppressing XML comments\n\
-v display version info\n\
-w don't generate WSDL and schema files\n\
-x don't generate sample XML message files\n\
-y include C/C++ type access information in sample XML messages\n\
infile header file to parse (or stdin)\n\
\n");

soapcpp2 -C -n -qsoap_cm -i -IXXX/import soap_cmService.h


style="document"

stype="RPC"

不同也会导致生成文件不同,使用方式的不同。


An XML schema (XSD file) can be transformed into a set of C or C++ definitions that can be readily incorporated into your application to manipulate XML with much more ease than DOM or SAX.


soap_mode sm=SOAP_IO_FLUSH;
sm |= SOAP_IO_KEEPALIVE; 
sm |= SOAP_XML_INDENT;
sm |= SOAP_XML_STRICT;
sm = sm|SOAP_DOM_NODE|SOAP_C_UTFSTRING;  ---- 编码设置为UTF-8的格式

soap_set_mode(this, sm);


c++ -DWITH_OPENSSL -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lssl -lcrypto

Let's take a look at an example SSL secure multi-threaded stand-alone SOAP Web Service: 

int main() 

   int m, s; 
   pthread_t tid; 
   struct soap soap, *tsoap; 
   soap_ssl_init(); /* init OpenSSL (just once) */ ---- 有些版本包含在soap_init中。
   if (CRYPTO_thread_setup()) // OpenSSL -------------------- 为了多线程安全,初始化“锁”等。
   { 
      fprintf(stderr, "Cannot setup thread mutex\n"); 
      exit(1); 
   } 
   soap_init(&soap); ---------------------- 
   if (soap_ssl_server_context(&soap, -------------------------服务器端初始化
      SOAP_SSL_DEFAULT, 


去除压缩算法:
        STACK_OF(SSL_COMP)* comp_methods = SSL_COMP_get_compression_methods();
        sk_SSL_COMP_zero(comp_methods);

你可能感兴趣的:(gsoap, wsdl2h, soapcpp2)