GSoap启用Zlib压缩

若想使用Zlib进行deflate/gzip压缩:

1)首先从http://www.zlib.org下载Zlib源码,并编译生成相关库文件;
2)将Zlib头文件、Zlib库添加至工程;
3)gSOAP支持deflate和gzip两种压缩格式,使用预编译命令(WITH_GZIPWITH_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环境变量不匹配而导致应用程序崩溃。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值