¿El Apache Commons HttpClient apoyo GZIP?
-
03-10-2019 - |
Pregunta
Tiene la biblioteca Apache Commons HttpClient apoyo gzip? Queríamos utilizar habilitar la compresión gzip en nuestro servidor Apache para acelerar las comunicaciones cliente / servidor (tenemos una página PHP que permite que nuestra aplicación Android para sincronizar archivos con el servidor).
Solución
Apache HttpClient 4.1 soportes contenido de compresión fuera de la caja, junto con muchas otras características que antes se consideraban fuera del ámbito.
Otros consejos
Si el servidor es capaz de proporcionar contenido gzipped, con el cliente Apache HTTP 4.1 todo lo que necesita es utilizar
org.apache.http.impl.client.ContentEncodingHttpClient
que es una subclase de DefaultHttpClient
.
Este cliente también añadirá cabeceras indicando que acepta el contenido gzipped.
No tiene soporte para este fuera de la caja, y parece poco probable que se añade a HttpClient 3.x (véase la edición de JIRA en lugar perra aquí ). Puede, sin embargo, hacerlo mediante la adición de lectores encargo de la petición y el manejo de flujo de petición / respuesta manual, en capas en la parte superior de la biblioteca básica, pero es más incómoda.
Parece que puede hacerlo con HttpClient 4, pero no sin un cierto esfuerzo.
bastante mal hecha, si me preguntas, esto realmente debería ser más fácil de lo que es.
Desde 4.1, manijas Apache HttpClients de petición y respuesta de compresión.
- Usted no necesita a la solicitud compresa, no hay necesidad de establecer cualquier "Accept-Encoding" en los encabezados de solicitud.
- Se encarga de automatizar la descompresión respuesta no es así, no hay necesidad de manejar la descompresión de la respuesta.
- Hasta 4.3 que maneja gzip y desinflado. Puede comprobar
ResponseContentEncoding
API doc aquí .
Sólo uso:
HttpClients.custom()
que usos:
HttpClientBuilder.create()
Si desea comprobar en HttpClientBuilder
Goto biblioteca que utiliza RequestAcceptEncoding
y ResponseContentEncoding
Se puede desactivar a través de "disableContentCompression ()"
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.disableContentCompression() //this disables compression
.build();
Por favor asegúrese de que si se añade ningún interceptor puede cambiarlos, use con cuidado.
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.setHttpProcessor(httpprocessor) //this interceptor can override your compression.
.build();
Este es el código Scala de muestra que utiliza la biblioteca de Java Apache-http-cliente
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()
}
Protocolo de encargo interceptores puede ayudar también.
exención de responsabilidad:. No he probado esto todavía
No se admite fuera de la caja, pero se puede transformar la entidad de HttpResponse
devuelto sin comprimir en un solo llamando
val entity = new GzipDecompressingEntity(response.getEntity)
a continuación, proceder con entity.getContent
como siempre.