2011-09-25 19 views
5

Qualcuno potrebbe dirmi cosa devo fare per decomprimere un contenuto GZIP quando ottengo la risposta da una chiamata Http.Decomprimere la risposta http GZIP (utilizzando jersey client api, java)

Per effettuare la chiamata io uso il client API Jersey, vedi codice qui sotto:

String baseURI = "http://api.stackoverflow.com/1.1/answers/7539863?body=true&comments=false"; 
ClientConfig config = new DefaultClientConfig(); 
Client client = Client.create(config); 
WebResource wr = client.resource(baseURI); 
ClientResponse response = null; 
response = wr.get(ClientResponse.class); 
String response_data = response.getEntity(String.class); 

System.out.println(response_data); 

Tuttavia l'uscita è compresso con gzip e si presenta come:

{J?J??t??`[email protected]??????.... 

Sarebbe bene se io potrebbe implementare quanto segue:

  • essere in grado di rilevare se il contenuto è GZIP o meno;
  • In caso contrario, elaborare come normale in una stringa; if, so uncompress e ottieni il contenuto in String
+0

Per Jersey 2.0 vedere http://stackoverflow.com/questions/17834028/questo-è-il-ciclo-2-0-equivalente-di-gzipcontentencodingfilter –

risposta

3

Non recuperare la risposta come entità. Recupera come un flusso di input e avvolgerlo in un java.util.zip.GZIPInputStream:

GZipInputStream is = new GZipInputStream(response.getEntityInputStream()); 

leggere i byte non compressi da soli e di trasformarlo in una stringa.

Inoltre, controllare se il server include l'intestazione HTTP Content-Encoding: gzip. In caso contrario, prova ad includerlo nella risposta. Forse Jersey è abbastanza intelligente da fare la cosa giusta.

+0

grazie, ma cosa succede se il contenuto non è-GZIPed (cioè è possibile implementare un modo per rilevare questo, in base alla risposta ricevuta?) – Larry

+0

Se è possibile dipendere dal comportamento corretto del server, è possibile controllare il valore Codifica contenuto. (In alternativa, la risposta potrebbe semplicemente impostare un tipo mime di application/x-gzip.) Utilizzare 'response.getHeaders()' e verificare i valori appropriati. L'unica altra cosa che posso pensare è che se sembra essere spazzatura sotto un presupposto, prova l'altro. –

0

In Jersey 2.x (io uso 2.26):

WebTarget target = ... 
target.register(GZipEncoder.class); 

Poi getEntity(String.class) può essere utilizzato sulla risposta, come al solito.