Поддерживает ли библиотека Apache Commons HttpClient поддержку Gzip? Мы хотели использовать сжатие gzip на нашем сервере Apache, чтобы ускорить обмен данными между клиентом и сервером (у нас есть страница php, которая позволяет нашему Android-приложению синхронизировать файлы с сервером).
Поддерживает ли Apache Commons HttpClient GZIP?
Ответ 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();
Ответ 6
Пользовательские перехватчики протоколов также могут помочь.
Отказ от ответственности: я еще не пробовал.
Ответ 7
Он не поддерживает его из коробки, но вы можете преобразовать объект возвращенного HttpResponse
в несжатый, вызывая
val entity = new GzipDecompressingEntity(response.getEntity)
тогда продолжайте entity.getContent
, как всегда.