Поддерживает ли Apache Commons HttpClient GZIP?

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

Ответ 1

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

Ответ 2

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

org.apache.http.impl.client.ContentEncodingHttpClient

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

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

Ответ 3

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

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

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

Ответ 4

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

 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

Начиная с 4.1, Apache HttpClients обрабатывает сжатие запросов и ответов. Вам не нужно сжимать запрос. Не нужно устанавливать "Accept-Encoding" в заголовках запросов и не нужно обрабатывать Decompression. До 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();

Ответ 7

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

val entity = new GzipDecompressingEntity(response.getEntity)

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