Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

org.apache.http.impl.client.ContentEncodingHttpClient

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

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

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

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

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

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

  • Вам не нужно компресснуть запрос, не нужно устанавливать какую-либо «принять кодировку» в заголовки запроса.
  • Он автоматически автоматически обрабатывает декомпрессию реагирования, не нужно обрабатывать декомпрессию реакции.
  • До 4,3 он обрабатывает gzip и deflate. Вы можете проверить ResponseContentEncoding API док здесь.

Просто используйте:

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 Code, который использует 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()
  }

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

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

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

val entity = new GzipDecompressingEntity(response.getEntity)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top