Ответ 1
Apache HttpClient 4.1 поддерживает сжатие содержимого из коробки вместе со многими другими функциями, которые ранее считались недоступными.
Поддерживает ли библиотека Apache Commons HttpClient поддержку Gzip? Мы хотели использовать сжатие gzip на нашем сервере Apache, чтобы ускорить обмен данными между клиентом и сервером (у нас есть страница php, которая позволяет нашему Android-приложению синхронизировать файлы с сервером).
Apache HttpClient 4.1 поддерживает сжатие содержимого из коробки вместе со многими другими функциями, которые ранее считались недоступными.
Если ваш сервер может предоставлять контент GZIPped, с клиентом Apache Http 4.1 все, что вам нужно, это использовать
org.apache.http.impl.client.ContentEncodingHttpClient
который является подклассом DefaultHttpClient
.
Этот клиент также добавит заголовки, в которых говорится, что он принимает контент GZIPped.
У него нет поддержки этого готового продукта, и он вряд ли будет добавлен в HttpClient 3.x(см. довольно сумасшедший вопрос JIRA здесь). Тем не менее, вы можете сделать это, добавив пользовательские считыватели запросов и ручную обработку запросов/ответов, расположенную поверх базовой библиотеки, но это неудобно.
Кажется, вы можете сделать это с HttpClient 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()
}
Начиная с 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();
Пользовательские перехватчики протоколов также могут помочь.
Отказ от ответственности: я еще не пробовал.
Он не поддерживает его из коробки, но вы можете преобразовать объект возвращенного HttpResponse
в несжатый, вызывая
val entity = new GzipDecompressingEntity(response.getEntity)
тогда продолжайте entity.getContent
, как всегда.