【问题标题】:Can I compress HTTP Requests using GZIP?我可以使用 GZIP 压缩 HTTP 请求吗?
【发布时间】:2026-01-18 02:50:02
【问题描述】:

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

【问题讨论】:

    标签: java java-me http-compression


    【解决方案1】:

    现代手机的 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"
    ... />
    

    【讨论】:

    • 正如 Stephen C 所说,这只会压缩数据还是 HTTP 标头?
    • @Kevin,这不会压缩标头。如果要压缩标头,客户端将如何确定它们的压缩方式 - GZIP 只是一种压缩方法。
    • @Kevin。那是正确的。标头无法使用基于标准的 HTTP 进行压缩。
    • 看看只发送绝对必要的标头。
    • 如果您压缩标头,它就不再是 HTTP。您也可以这样做,但您需要一个压缩隧道。 J2ME 不支持这个,所以会有更多的工作。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果您想避免在网络中引入 Apache HTTP 服务器,可以使用写入 ZipOutputStream 或 GZipOutputStream 的 servlet 或 servlet 过滤器以编程方式完成。你会在how to do this at the OReilly OnJava.com site上找到一些指针。

      【讨论】:

      • 你可以在 Tomcat 中进行 gzip 压缩,而无需添加 Apache。查看HTTP连接器的压缩属性:tomcat.apache.org/tomcat-5.5-doc/config/http.html
      • 是的,我知道,但是在 HTTP 服务器上进行压缩而不是在应用程序服务器上进行压缩是有原因的——服务器负载的分布。除了运行应用程序逻辑的常规任务之外,人们不希望应用程序服务器承担响应压缩的负担。此外,Apache HTTP 服务器具有比 Tomcat 更好的性能特点。
      【解决方案4】:

      在服务器端,您可以按照here 的描述启用它,但移动应用程序需要一个可以解压缩gzip 的库,例如this one。可能需要做一些工作才能让它工作......

      【讨论】: