Non Apache Commons HttpClient supporto GZIP?
-
03-10-2019 - |
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).
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.