繁体   English   中英

我可以使用GZIP压缩HTTP请求吗?

[英]Can I compress HTTP Requests using GZIP?

我正在使用移动设备上的Java ME应用程序与Tomcat服务器通信。
我想知道我是否可以使用Gzip压缩我的请求/响应以减少通过网络发送的字节数。

现代手机具有如此多的CPU功率,网络相对较慢,因此压缩非常有意义。 这也很容易。

在J2ME方面,你做这样的事情(假设你使用HttpConnection),

  hc.setRequestProperty("Accept-Encoding", "gzip, deflate");
  if (hc.getResponseCode() == HttpConnection.HTTP_OK) {
      InputStream in = hc.openInputStream();
      if ("gzip".equals(hc.getEncoding())) 
         in = new GZIPInputStream(in);
  ...

我们使用来自tinyline的GZIPInputStream,但我相信还有其他人,

http://www.tinyline.com/utils/index.html

在服务器端,它都是内置的。 只需将以下属性添加到Tomcat上server.xml中的Connector即可,

<Connector 
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,application/json"
... />

您可以压缩HTTP请求或响应的内容,但不压缩标头。 请参阅HTTP 1.1规范的第3.6节和后面描述Content-Encoding标头的部分。

编辑:这方面的另一面是,无法保证HTTP服务器端将接受任何特定的压缩格式。 并且根据HTTP的服务器端实现的质量,它甚至可能无法识别请求内容已被压缩。 因此,除非您知道服务器端支持压缩的请求内容,否则您不希望这样做。

由于您使用的是Tomcat,因此请考虑将Apache HTTP Server实例放在Tomcat服务器之前的可能性。

这可以使用Apache HTTP Server的mod_jk模块完成。 完成后,您可以在Apache中使用mod_gzip / mod_deflate

当然,您的客户端应该能够处理压缩响应,以实现此目的。 如果强制客户端使用压缩响应,客户端最终会显示乱码,因为它(通常)会期待纯文本响应。 您将在客户端的Accept-Encoding标头中找到客户端处理压缩响应的能力的明确指示。

如果要避免在网络中引入Apache HTTP Server,可以使用servlet或写入ZipOutputStream或GZipOutputStream的servlet过滤器以编程方式完成此操作。 您可以在OReilly OnJava.com网站上找到有关如何执行此操作的一些建议

在服务器端,您可以按照此处所述启用它,但移动应用程序将需要一个可以解压缩gzip的库,例如这个 可能需要一些工作来让它工作......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM