Ли Apache общин поддерживают с помощью HttpClient помощью gzip?
поддерживает ли библиотека Apache Commons HttpClient gzip? Мы хотели использовать сжатие enable gzip на нашем сервере Apache для ускорения связи клиент / сервер (у нас есть страница php, которая позволяет нашему приложению Android синхронизировать файлы с сервером).
7 ответов
Apache HttpClient 4.1 поддерживает сжатие содержимого из коробки вместе со многими другими функциями, которые ранее считались вне сферы действия.
Если ваш сервер может предоставить контент GZIPped, с Apache Http client 4.1 все, что вам нужно, это использовать
org.apache.http.impl.client.ContentEncodingHttpClient
который является подклассом DefaultHttpClient
.
этот клиент также добавит заголовки, говорящие, что он принимает содержимое GZIPped.
У него нет поддержки для этого из коробки, и кажется маловероятным, что он будет добавлен в HttpClient 3.x (см. довольно стервозный выпуск JIRA здесь). Однако вы можете сделать это, добавив пользовательские считыватели запросов и ручную обработку потока запросов/ответов поверх базовой библиотеки, но это неудобно.
кажется, вы можете сделать это с помощью HttpClient 4, но не без некоторых усилий.
довольно дрянной, если вы спросите меня, этот материал действительно должен быть проще, чем это есть.
начиная с 4.1, Apache HttpClients обрабатывает сжатие запросов и ответов.
- вам не нужно сжимать запрос, нет необходимости устанавливать "Accept-Encoding" в заголовках запроса.
- он автоматически обрабатывает декомпрессию ответа, а также, нет необходимости обрабатывать декомпрессию ответа.
- до 4.3 он обрабатывает gzip и deflate. Вы можете проверить
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();
вот пример кода scala, который использует java apache-http-client library
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
как всегда.