Поддерживает ли Apache Commons HttpClient GZIP? - PullRequest
28 голосов
/ 06 мая 2010

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

Ответы [ 7 ]

27 голосов
/ 07 мая 2010

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

17 голосов
/ 04 августа 2011

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

org.apache.http.impl.client.ContentEncodingHttpClient

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

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

8 голосов
/ 06 мая 2010

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

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

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

4 голосов
/ 24 октября 2017

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

  • Вам не нужно сжимать запрос, не нужно устанавливать «Accept-Encoding» в заголовках запроса.
  • Также автоматически обрабатывается декомпрессия ответа, нет необходимости обрабатывать декомпрессию ответа.
  • До 4.3 он обрабатывает gzip и выкачивает. Вы можете проверить 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();
1 голос
/ 16 мая 2017

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

 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()
  }
0 голосов
/ 14 мая 2016

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

val entity = new GzipDecompressingEntity(response.getEntity)

затем продолжайте с entity.getContent как всегда.

0 голосов
/ 27 марта 2014

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

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

...