24

¿La biblioteca Apache Commons HttpClient es compatible con Gzip? Queríamos utilizar la compresión enable gzip en nuestro servidor Apache para agilizar las comunicaciones cliente/servidor (tenemos una página php que permite a nuestra aplicación Android sincronizar archivos con el servidor).¿Apache Commons HttpClient es compatible con GZIP?

Respuesta

23

Apache HttpClient 4.1 admite la compresión de contenido fuera de la caja junto con muchas otras características que anteriormente se consideraban fuera del alcance.

+44

¿cómo lo saco de la caja? – djechlin

+0

En 4.5.3, simplemente use un cliente mediante HttpClientBuilder.create(). Build(), y se encargará de toda la descompresión de solicitud y respuesta gzip por usted. –

7

No tiene soporte para este out-of-the-box, y parece improbable que se agregue a HttpClient 3.x (vea el problema de JIRA en bitch here). Sin embargo, puede hacerlo agregando lectores de solicitudes personalizadas y el manejo manual de la solicitud/respuesta, en capas sobre la biblioteca básica, pero es complicado.

Parece que puede hacerlo con HttpClient 4, pero no sin un esfuerzo.

Bastante de mala calidad, si me preguntas, esto realmente debería ser más fácil de lo que es.

+5

+1 para la lectura entretenida – karim79

+1

@ karim79 (!): He abandonado toda esperanza de que HttpClient es mantenido por cualquier persona con un sentido de la realidad (como si la API HttpClient 4 no era suficiente evidencia) . – skaffman

+0

@skaffman ¿hay algo mejor para usar en Java? – djechlin

17

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 agregará encabezados diciendo que acepta contenido GZIPped.

+0

Esto funcionó perfecto para mí, gracias –

+13

En HttpClient 4.2.1, 'ContentEncodingHttpClient' está en desuso; se alienta a los usuarios a utilizar el Cliente de descompresión Http, consulte http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DecompressingHttpClient.html – Hbf

+2

@Hbf, también obsoleto. – djechlin

0

No admite que fuera de la caja, pero se puede transformar la entidad de regresar HttpResponse en un solo comprimido llamando

val entity = new GzipDecompressingEntity(response.getEntity) 

luego proceder con entity.getContent como siempre.

1

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() 
    } 
1

Desde 4.1, Apache HttpClients maneja petición y la respuesta de compresión. No necesita comprimir la solicitud. No es necesario configurar ninguna "Aceptación de codificación" en los encabezados de solicitud & sin necesidad de manejar Descompresión. Hasta 4.3 puede manejar gzip y desinflar. Puede marcar ResponseContentEncoding api doc here.

sólo tiene que utilizar:

HttpClients.custom() 

la que utiliza:

HttpClientBuilder.create() 

Si desea comprobar en la biblioteca Goto HttpClientBuilder se utiliza RequestAcceptEncoding & ResponseContentEncoding

Se puede desactivar a través de "disableContentCompression () "

HttpClient httpClient = HttpClients.custom() 
       .setConnectionManager(cm) 
       .disableContentCompression() //this disables compression 
       .build(); 

Asegúrese de que si agrega cualquier interceptor, puede anularlo, úselo con cuidado.

HttpClient httpClient = HttpClients.custom() 
       .setConnectionManager(cm) 
       .setHttpProcessor(httpprocessor) //this interceptor can override your compression. 
       .build(); 
Cuestiones relacionadas