若想使用Zlib进行deflate/gzip压缩:
1)首先从http://www.zlib.org下载Zlib源码,并编译生成相关库文件;
2)将Zlib头文件、Zlib库添加至工程;
3)gSOAP支持deflate和gzip两种压缩格式,使用预编译命令(WITH_GZIP或WITH_ZLIB,代表启用gzip或deflate压缩格式)编译stdsoap2.cpp/stdsoap2.c以及所有包含stdsoap2.h或soapH.h的源程序;
4)为了传输gzip压缩的SOAP/XML数据,发送端需要为soap输出模式增加SOAP_ENC_ZLIB标识:
soap_set_omode(soap, soap->omode | SOAP_ENC_ZLIB)
接收端不必设置SOAP_ENC_ZLIB标识,其可自动接收、读取HTTP传输的gzip/有HTTP头的deflate格式压缩的SOAP/XML。
相较于deflate,gzip格式有3个方面的优势:
1)通过检查消息内容中的gzip头,gSOAP能够自动接收、读取gzip压缩的消息,即使没有HTTP头;(对于没有HTTP头的deflate压缩消息的接收不是自动的,为了解压消息,接收端需要为soap输入模式增加SOAP_ENC_ZLIB标识)
2)gzip包含CRC32校验和,以确保消息能被正确接收;
3)gzip压缩的内容可被其他压缩软件解压,因此你可以解压gSOAP保存的gzip格式的XML数据。
传输编码:
gzip压缩支持所有的传输编码,如HTTP、SSL、DIME,也可以应用于其他传输层。你甚至可以将压缩的XML数据保存至文件,或从文件加载压缩的XML数据。
压缩级别:
通过设置soap.z_level,可控制报文的压缩级别。soap.z_level的取值范围为1-9,默认是6,其中1:最快速度压缩,9:最大压缩。
使用soap.z_ratio_in和soap.z_ratio_out可查看压缩率,这两个数的值介于0.0-1.0之间, 分别代表压缩后的报文长度和未压缩的报文长度。
HTTP分块:
为了确定HTTP报文长度,压缩传输需要缓存整个发送报文,这就意味着,当我们为了传输压缩报文而设置SOAP_ENC_ZLIB时,SOAP_IO_STORE标识会被自动设置。
通过设置SOAP_IO_CHUNK标识,可启用HTTP分块,其能够显著减少内存的使用,甚至可能提高压缩的SOAP/XML消息的传输速度。但是,某些Web服务并不接收HTTP分块的请求消息(即使它们能够返回HTTP分块消息)。
客户端和服务端交互流程(gzip压缩):
1)客户端服务请求Headers中包含消息头“Accept-Encoding: gzip, deflate”,表示客户端支持gzip和deflate两种压缩编码;
2)服务端设置输出模式为:SOAP_ENC_ZLIB后,GSoap自动调用Zlib对响应报文进行压缩,同时响应报文Headers中包含消息头“Content-Encoding: gzip”,表示响应报文已按gzip格式压缩;
3)客户端接收到响应报文后,GSoap检测到Headers包含消息头“Content-Encoding: gzip”,则自动按gzip格式解压报文。
注意:
在编译stdsoap2.cpp、soapC.cpp、soapClient.cpp、soapServer.cpp以及所有包含stdsoap2.h或soapH.h的源文件时,宏WITH_GZIP和WITH_ZLIB的使用必须一致,否则因为申明和访问的gSOAP环境变量不匹配而导致应用程序崩溃。