Domanda

La biblioteca Apache Commons HttpClient supporta Gzip? Abbiamo voluto utilizzare abilitare la compressione gzip sul nostro server Apache per velocizzare le comunicazioni client / server (abbiamo una pagina PHP che permette la nostra applicazione Android per sincronizzare i file con il server).

È stato utile?

Soluzione

Apache HttpClient 4.1 supporta la compressione dei contenuti fuori dalla scatola insieme a molte altre funzioni che in precedenza erano considerati fuori portata.

Altri suggerimenti

Se il server è in grado di fornire contenuto compresso, con Apache Http cliente 4.1 tutto ciò che serve è quello di utilizzare

org.apache.http.impl.client.ContentEncodingHttpClient

, che è una sottoclasse di DefaultHttpClient.

Questo client sarà anche aggiungere intestazioni dicendo che accetta contenuti compressi con gzip.

Non ha alcun supporto per questo out-of-the-box, e sembra improbabile che possa essere aggiunto alla HttpClient 3.x (vedi piuttosto bisbetico problema JIRA qui ). È possibile, tuttavia, farlo con l'aggiunta di richiesta personalizzato lettori e gestione flusso di richiesta / risposta manuale, a strati in cima alla libreria di base, ma è poco pratici.

Sembra che si può fare con HttpClient 4, ma non senza un certo sforzo.

Piuttosto scadente, se mi chiedete, questa roba in realtà dovrebbe essere più facile di quanto non sia.

Dal 4.1, Apache HttpClients maniglie richiesta e la compressione di risposta.

  • Non c'è bisogno di richiesta di comprimere, non c'è bisogno di impostare qualsiasi "Accept-Encoding" in intestazioni di richiesta.
  • Gestisce automaticamente la decompressione risposta così, non c'è bisogno di gestire decompressione della risposta.
  • Fino a 4.3 gestisce gzip e sgonfiare. È possibile controllare ResponseContentEncoding api doc qui .

Proprio uso:

HttpClients.custom()

che usi:

HttpClientBuilder.create()

Se si desidera controllare nella biblioteca HttpClientBuilder goto usa RequestAcceptEncoding & ResponseContentEncoding

È possibile disattivare tramite "disableContentCompression ()"

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

Si prega di accertarsi se si aggiunge qualsiasi intercettore si può ignorare che, usarlo con attenzione.

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

Ecco il codice Scala campione che utilizza la libreria Java di Apache-http-client

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

personalizzato protocollo intercettori può aiutare pure.

. Disclaimer: non ho ancora provato questo

non supporta fuori area di rigore ma è possibile trasformare entità HttpResponse tornato in uno non compresso chiamando

val entity = new GzipDecompressingEntity(response.getEntity)

quindi procedere con entity.getContent come sempre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top