Apache Commons HttpClient поддерживает GZIP?
-
03-10-2019 - |
Вопрос
Библиотека 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
как всегда.