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).

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top