2011-09-25 16 views
5

¿Podría alguien decirme qué debo hacer para descomprimir un contenido GZIP al obtener la respuesta de alguna llamada Http?Descomprimir la respuesta HTTP de GZIP (usando la aplicación api de cliente de jersey, java)

Para hacer la llamada que utilizan la API de cliente Jersey, véase el código de abajo:

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); 

Sin embargo, la salida es GZIP y se parece a:

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

Sería bueno si podría implementar lo siguiente:

  • pudiendo detectar si el contenido está GZIP o no;
  • De lo contrario, procese como lo hace normalmente en una Cadena; if, así que descomprime y obtén el contenido en String
+0

Para Jersey 2.0 ver http://stackoverflow.com/questions/17834028/what-is-the-jersey-2-0-equivalent-of-gzipcontentencodingfilter –

Respuesta

3

No recuperes la respuesta como una entidad. Recuperarlo como un flujo de entrada y se envuelve en una java.util.zip.GZIPInputStream:

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

A continuación, lea los bytes sin comprimir a sí mismo y convertirlo en una cadena.

Además, compruebe si el servidor incluye el encabezado HTTP Content-Encoding: gzip. Si no, intente incluirlo en la respuesta. Tal vez Jersey es lo suficientemente inteligente como para hacer lo correcto.

+0

gracias, pero ¿y si el contenido no es-GZIPed (es decir, ¿podría implementar una forma de detectar esto, dependiendo de la respuesta recibida?) – Larry

+0

Si puede confiar en que el servidor se comporte correctamente, puede verificar el valor de codificación del contenido. (Alternativamente, la respuesta podría simplemente establecer un tipo mime de application/x-gzip.) Use 'response.getHeaders()' y pruebe los valores apropiados. La única otra cosa en la que puedo pensar es que si parece ser basura bajo una suposición, prueba con la otra. –

0

En Jersey 2.x (yo uso 2.26):

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

Entonces getEntity(String.class) se puede utilizar en la respuesta como de costumbre.

Cuestiones relacionadas