Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, как всегда.