2011-09-25 122 views
5

有人可以告诉我在从某个Http调用获取响应时,为了解压缩GZIP内容需要做什么。解压缩GZIP http响应(使用jersey客户端api,java)

为了让我使用Jersey客户端API调用,请参见下面的代码:

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

但是输出是gzip压缩的,看起来像:

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

请将我好可以执行以下操作:

  • 能够检测内容是否是GZIP'd;
  • 如果不是,像String中的普通处理;如果,如此解压缩并获取字符串中的内容
+0

对于泽西岛2.0请参阅http://stackoverflow.com/questions/17834028/what-is-the-jersey-2-0-equivalent-of-gzipcontentencodingfilter –

回答

3

不检索作为实体的响应。检索它作为输入流,并在java.util.zip.GZIPInputStream包装它:

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

然后自己读取的未压缩字节并把它变成一个字符串。

另外,检查服务器是否包含HTTP标头Content-Encoding: gzip。如果没有,请尝试将其包含在回复中。也许泽西足够聪明地做正确的事情。

+0

谢谢,但如果内容不是GZIPed(即我可以实现一种方法来检测这种情况,具体取决于收到的响应吗?) – Larry

+0

如果您可以依赖服务器正常运行,则可以检查Content-Encoding值。 (或者,响应可能只是设置MIME类型的application/x-gzip。)使用'response.getHeaders()'并测试适当的值。我能想到的另一件事是,如果在一个假设下它似乎是垃圾,那么试试其他的。 –

0

在新泽西2.x的(我用2.26):

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

然后getEntity(String.class)可以在响应照常使用。