Apache Commons HttpClient是否支持GZIP?

时间:2010-05-05 21:55:46

标签: java gzip apache-commons apache-httpclient-4.x apache-commons-httpclient

Apache Commons HttpClient库是否支持Gzip?我们想在我们的Apache服务器上使用enable gzip压缩来加速客户端/服务器通信(我们有一个php页面,允许我们的Android应用程序与服务器同步文件)。

7 个答案:

答案 0 :(得分:27)

Apache HttpClient 4.1支持开箱即用的内容压缩以及之前被认为超出范围的许多其他功能。

答案 1 :(得分:17)

如果您的服务器能够提供GZIPped内容,那么使用Apache Http客户端4.1只需要使用

org.apache.http.impl.client.ContentEncodingHttpClient

DefaultHttpClient的子类。

此客户端还会添加标题,表示它接受GZIPped内容。

答案 2 :(得分:8)

它不支持这种开箱即用的功能,似乎不太可能被添加到HttpClient 3.x(请参阅相当讨厌的JIRA问题here)。但是,您可以通过添加自定义请求阅读器和手动请求/响应流处理来实现,这些处理分层在基本库之上,但它很繁琐。

看来你可以用HttpClient 4做到这一点,但不是没有一点努力。

非常粗制滥造,如果你问我,这些东西真的应该比它更容易。

答案 3 :(得分:3)

自4.1以来,Apache HttpClients处理请求和响应压缩。

  • 您不需要压缩请求,也不需要设置任何" Accept-Encoding"在请求标题中。
  • 它也会自动处理响应解压缩,无需处理响应的解压缩。
  • 直到4.3它处理gzip和deflate。您可以查看ResponseContentEncoding api doc here

只需使用:

HttpClients.custom()

使用:

HttpClientBuilder.create()

如果您想在图书馆转到HttpClientBuilder,请使用RequestAcceptEncoding& ResponseContentEncoding

您可以通过" disableContentCompression()"

禁用它
HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .disableContentCompression() //this disables compression
                .build();

请确保添加任何可以覆盖它的拦截器,小心使用它。

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();

答案 4 :(得分:1)

以下是使用java apache-http-client library

的示例scala代码
 def createCloseableHttpClient(): CloseableHttpClient = {
    val builder: HttpClientBuilder = HttpClientBuilder.create
    val closableClient = builder.build()
    closableClient
  }

  def postData(data: String): Unit = {
    val entity = EntityBuilder.create()
      .setText(data)
      .setContentType(ContentType.TEXT_PLAIN)
      .gzipCompress()
      .build()
    val post = new HttpPost(postURL + endPoint)
    post.setEntity(entity)
    post.setHeader("Content-Type", "application/gzip")
    val client = createCloseableHttpClient()
    client.execute(post)
    client.close()
  }

答案 5 :(得分:0)

Custom Protocol Interceptors也可能会有所帮助。

免责声明:我还没试过。

答案 6 :(得分:0)

它不支持开箱即用,但您可以通过调用

将返回的HttpResponse的实体转换为未压缩的实体
val entity = new GzipDecompressingEntity(response.getEntity)

然后一如既往地继续entity.getContent