Ли Apache общин поддерживают с помощью HttpClient помощью gzip?

поддерживает ли библиотека Apache Commons HttpClient gzip? Мы хотели использовать сжатие enable gzip на нашем сервере Apache для ускорения связи клиент / сервер (у нас есть страница php, которая позволяет нашему приложению Android синхронизировать файлы с сервером).

7 ответов


Apache HttpClient 4.1 поддерживает сжатие содержимого из коробки вместе со многими другими функциями, которые ранее считались вне сферы действия.


Если ваш сервер может предоставить контент GZIPped, с Apache Http client 4.1 все, что вам нужно, это использовать

org.apache.http.impl.client.ContentEncodingHttpClient

который является подклассом DefaultHttpClient.

этот клиент также добавит заголовки, говорящие, что он принимает содержимое GZIPped.


У него нет поддержки для этого из коробки, и кажется маловероятным, что он будет добавлен в HttpClient 3.x (см. довольно стервозный выпуск JIRA здесь). Однако вы можете сделать это, добавив пользовательские считыватели запросов и ручную обработку потока запросов/ответов поверх базовой библиотеки, но это неудобно.

кажется, вы можете сделать это с помощью HttpClient 4, но не без некоторых усилий.

довольно дрянной, если вы спросите меня, этот материал действительно должен быть проще, чем это есть.


начиная с 4.1, Apache HttpClients обрабатывает сжатие запросов и ответов.

  • вам не нужно сжимать запрос, нет необходимости устанавливать "Accept-Encoding" в заголовках запроса.
  • он автоматически обрабатывает декомпрессию ответа, а также, нет необходимости обрабатывать декомпрессию ответа.
  • до 4.3 он обрабатывает gzip и deflate. Вы можете проверить ResponseContentEncoding api doc здесь.

просто использовать:

HttpClients.custom()

использует:

HttpClientBuilder.create()

если вы хотите проверить в библиотеке goto 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();

вот пример кода scala, который использует java apache-http-client library

 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()
  }

Перехватчики Пользовательских Протоколов может также помочь.

отказ от ответственности: я не пробовал это.


Он не поддерживает его из коробки, но вы можете преобразить лицо возвращаемых HttpResponse в несжатый, вызвав

val entity = new GzipDecompressingEntity(response.getEntity)
продолжить entity.getContent как всегда.