24

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

23

Apache HttpClient 4.1 supporta la compressione del contenuto fuori dalla scatola insieme a molte altre funzionalità precedentemente considerate fuori ambito.

+44

come lo tolgo dalla scatola? – djechlin

+0

In 4.5.3, basta usare un client HttpClientBuilder.create(). Build(), e gestirà tutte le richieste di gzip e la decompressione della risposta. –

7

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

+5

+1 per la lettura divertente – karim79

+1

@ karim79 (!): Ho abbandonato ogni speranza che HttpClient viene mantenuto da chiunque con una presa sulla realtà (come se l'API HttpClient 4 non era abbastanza prove) . – skaffman

+0

@skaffman c'è qualcosa di meglio da usare in java? – djechlin

17

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.

+0

Questo ha funzionato perfettamente per me, grazie –

+13

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

+2

@Hbf anche deprecato. – djechlin

0

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.

1

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

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(); 
Problemi correlati