Gsoap中文文档
1、背景
转贴
2 gSOAP文档翻译计划
2.1 gSOAP文档翻译计划(序)
前一阵子需要在unix c平台下创建一个webservice应用。头痛之余,上网查询相关资料,偶然发现了gSOAP开发包。于是乎立即下载试用了一下,效果很好。在它的帮助下,我很快完成了webservice应用的设计开发工作。今天,心里突然升起一个念头:为何不把整个gSOAP 的帮助文档翻译一下呢?一来可以方便与其他同仁的交流;二来也可以更好的理解gSOAP 的原理与思想。只是此项工程工作浩繁,须怀有革命的大无畏精神尚可完成也。如今唯先写一序,实则有督促之意耳。
2.2 gSOAP文档翻译计划(1、介绍)
1.介绍
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 单向消息。如何生成webservice客户端
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.3 gSOAP文档翻译计划(2、符号规定)
2.4 gSOAP文档翻译计划(3)
gSOAP2.5版与gSOAP 2.4版(或以前版本)的不同按照WS-I Basic Profile 1.0a的要求,gSOAP2.5及以上版本默认使用SOAP RPC文字。这不需要去关心,因为WSDL解析器wsdl2h在你提供一个WSDL文档时,会自动注意这些不同点。增加了一个soapcpp2编译器的编译选项-e ,用来保持与gSOAP2.4及以前版本的兼容性。
2.5 gSOAP文档翻译计划(4)
gSOAP2.2版与gSOAP 2.1版(或以前版本)的不同如果你是从2.1版升级到2.2或以后版本,请注意这些变化。为了能够分离传输、内容编码、映射中的接收/发送设置,改变了运行时选项及标志。这些标志分布再四个类中:传输(IO),内容编码(ENC,XML编组(XML)及C/C++数据映射。不再提倡使用旧标志soap_disable_X及soap_enable_X(其中,X表示选项名)。具体内容请参见9.12节。
2.6 gSOAP文档翻译计划(5)
gSOAP2.x版与gSOAP 1.x版的不同,如果你是从1.x版升级到2.x版,请注意下面的内容。gSOAP2.0及之后的版本是在1.x版基础上重写的。gSOAP2.0之后的版本是线程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已经重新命名,以便与1.x版区分。
gSOAP 1.X gSOAP 2.X
soapcpp soapcpp2
<
stdsoap.h stdsoap2.h
stdsoap.c stdsoap2.c
stdsoap.cpp stdsoap2.cpp
从1.x版升级到2.x版并不需要进行大量的代码重写工作。所有2.x版相关的函数都定义在stdsoap2.c[pp]文件中,这个文件是由gSOAP编译器自动生成的。所以,用1.x版开发
的服务端或客户端代码需要进行修改以适应2.x版中函数的变化:在2.x版中,所有的gSOAP 函数都增加了一个参数用来保存一个gSOAP运行环境实例。这个参数包括了文件描述,表,缓冲,标志位等,它在所有gSOAP函数中都是第一个参数。
gSOAP运行环境实例是一个struct soap类型的变量。当客户端程序访问远程方法前或当服务端程序能够接收一个请求前,必须先将这个运行环境变量初始化。在2.x版中新增了3个函数来负责这些事情:
函数解释
soap_init(struct soap *soap) 初始化环境变量(只需执行一次)
struct soap *soap_new() 定义并初始化环境变量并返回一个该变量的指针
struct soap *soap_copy(struct soap *soap) 定义一个环境变量并从已有的环境变量中拷贝环
境信息
环境变量定义好后就可以重复使用而不必再次初始化了。只有当线程独占访问时,我们才需要一个新的环境变量。例如,下面的代码分配了一个用于多个远程方法的环境变量:
int main()
{
struct soap soap;
soap_init(&soap); // 初始化环境变量
...
soap_call_ns__method1(&soap, ...); // 调用一个远程方法
soap_call_ns__method2(&soap, ...); // 调用另一个远程方法
soap_end(&soap); // 清除环境变量
}
我们也可以像下面这样定义环境变量:
int main()
{
struct soap *soap;
soap = soap_new(); // 定义并初始化环境变量
if (!soap) // 如果不能定义,退出
soap_call_ns__method1(soap, ...); // 调用远程函数
soap_call_ns__method2(soap, ...); // 调用另一个远程函数
soap_end(soap); // 清除环境变量
free(soap); // 释放环境变量空间
}
服务端代码在调用soap_serve函数前,需要定义相关环境变量:
int main()
{
struct soap soap;
soap_init(&soap);
soap_serve(&soap);
}
或者像下面这样:
int main()
{
soap_serve(soap_new());
}
soap_serve函数用来处理一个或多个(当允许HTTP keep-alive时,参见18.11节中的SOAP_IO_KEEPALIVE标志)请求。
一个web服务可以用多线程技术来处理请求:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论