Java Apache Commons HttpClient支持GZIP吗?

Java Apache Commons HttpClient支持GZIP吗?,java,gzip,apache-commons,apache-httpclient-4.x,apache-commons-httpclient,Java,Gzip,Apache Commons,Apache Httpclient 4.x,Apache Commons Httpclient,ApacheCommonsHttpClient库是否支持Gzip?我们希望在Apache服务器上使用enable gzip压缩来加速客户机/服务器通信(我们有一个php页面,允许Android应用程序与服务器同步文件) 它不支持这种开箱即用的方式,而且似乎不太可能被添加到HttpClient 3.x中(请参阅相当恶毒的JIRA问题)。不过,您可以通过添加自定义请求读取器和手动请求/响应流处理来实现这一点,这些都是在基本库的基础上分层的,但这很复杂 您似乎可以使用httpclient4来完成这项工

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

它不支持这种开箱即用的方式,而且似乎不太可能被添加到HttpClient 3.x中(请参阅相当恶毒的JIRA问题)。不过,您可以通过添加自定义请求读取器和手动请求/响应流处理来实现这一点,这些都是在基本库的基础上分层的,但这很复杂

您似乎可以使用httpclient4来完成这项工作,但需要付出一些努力


相当劣质,如果你问我,这东西真的应该比它简单。

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

如果你的服务器能够提供Gzip内容,那么使用Apache Http client 4.1,你所需要的就是使用它

org.apache.http.impl.client.ContentEncodingHttpClient
它是
DefaultHttpClient
的子类

此客户端还将添加标题,说明它接受gzip内容。

也可能有帮助


免责声明:我还没有尝试过这个方法。

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

val entity = new GzipDecompressingEntity(response.getEntity)

然后继续执行
entity.getContent

下面是使用java apache http客户端库的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()
  }

从4.1开始,ApacheHttpClient处理请求和响应压缩

  • 您不需要压缩请求,也不需要在请求头中设置任何“接受编码”
  • 它还自动处理响应解压缩,无需处理响应解压缩
  • 直到4.3,它处理gzip和放气。您可以检查
    ResponseContentEncoding
    api文档
只需使用:

HttpClients.custom()
它使用:

HttpClientBuilder.create()
如果要签入库,请转到
HttpClientBuilder
,它使用
RequestAcceptEncoding
&
ResponseContentEncoding

您可以通过“disableContentCompression()禁用它”

请确保如果您添加了任何拦截器,它可以覆盖该拦截器,请小心使用

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

@karim79:我已经放弃了任何希望,认为任何一个掌握现实的人都在维护HttpClient(好像HttpClient 4 API不够有力)。在HttpClient 4.2.1中,
ContentEncodingHttpClient
被弃用;鼓励用户使用解压缩HttpClient,请参阅@Hbf。从4.3开始,应使用它(而不是
ContentEncodingHttpClient
DecompressingHttpClient
)。使用
HttpClientBuilder
,您必须调用生成器上的任何特定方法才能启用gzip吗?或者您只需要不调用
disableContentCompression()
?不,压缩是自动启用的。我在4.5.3中尝试过,并使用wireshark捕获了请求响应:“Accept Encoding:gzip,deflate”头自动添加到请求中,响应内容可以自动解压缩。如何将其从盒子中取出?在4.5.3中,只需使用HttpClientBuilder.create().build()的客户端,它将为您处理所有gzip请求和响应解压缩。
HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();