La libreria Apache Commons HttpClient supporta Gzip? Volevamo abilitare la compressione gzip sul nostro server Apache per velocizzare le comunicazioni client/server (abbiamo una pagina php che consente alla nostra applicazione Android di sincronizzare i file con il server).Apache Commons HttpClient supporta GZIP?
risposta
Apache HttpClient 4.1 supporta la compressione del contenuto fuori dalla scatola insieme a molte altre funzionalità precedentemente considerate fuori ambito.
Non ha alcun supporto per questo out-of-the-box, e sembra improbabile che venga aggiunto a HttpClient 3.x (vedi problema di JIRA piuttosto bitchy here). Puoi, tuttavia, farlo aggiungendo lettori di richieste personalizzate e gestione manuale del flusso di richieste/risposte, sovrapposti alla libreria di base, ma è un po 'complicato.
Sembra che tu possa farlo con HttpClient 4, ma non senza alcuno sforzo.
Abbastanza scadente, se me lo chiedi, questa roba dovrebbe essere più facile di quello che è.
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 aggiungerà anche intestazioni dicendo che accetta contenuti GZIP.
Questo ha funzionato perfettamente per me, grazie –
In HttpClient 4.2.1, 'ContentEncodingHttpClient' è deprecato; gli utenti sono incoraggiati a utilizzare DecompressingHttpClient, vedere http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DecompressingHttpClient.html – Hbf
@Hbf anche deprecato. – djechlin
Custom Protocol Interceptors può essere d'aiuto.
Disclaimer: Non ho ancora provato questo.
Non supporta fuori area di rigore ma è possibile trasformare entità tornato HttpResponse
in uno non compresso chiamando
val entity = new GzipDecompressingEntity(response.getEntity)
quindi procedere con entity.getContent
come sempre.
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()
}
Dal 4.1, Apache HttpClients gestisce richiesta e la compressione di risposta. Non è necessario comprimere la richiesta. Non è necessario impostare alcuna "Accept-Encoding" nelle intestazioni di richiesta &, non è necessario gestire la decompressione. Fino a 4.3 è in grado di gestire gzip e deflate. È possibile controllare ResponseContentEncoding
api doc here.
Basta usare:
HttpClients.custom()
che utilizza:
HttpClientBuilder.create()
Se si desidera controllare nella biblioteca goto HttpClientBuilder
utilizza RequestAcceptEncoding
& ResponseContentEncoding
È possibile disattivare tramite "disableContentCompression () "
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.disableContentCompression() //this disables compression
.build();
Accertarsi che se si aggiunge un interceptor, è possibile ignorarlo, utilizzarlo con attenzione.
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.setHttpProcessor(httpprocessor) //this interceptor can override your compression.
.build();
come lo tolgo dalla scatola? – djechlin
In 4.5.3, basta usare un client HttpClientBuilder.create(). Build(), e gestirà tutte le richieste di gzip e la decompressione della risposta. –