解压缩GZIP http响应(使用jersey客户端api,java)
有人可以告诉我在从某个Http调用获取响应时,为了解压缩GZIP内容需要做什么。解压缩GZIP http响应(使用jersey客户端api,java)
为了让我使用Jersey客户端API调用,请参见下面的代码:
String baseURI = "http://api.*.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中的普通处理;如果,如此解压缩并获取字符串中的内容
不检索作为实体的响应。检索它作为输入流,并在java.util.zip.GZIPInputStream包装它:
GZipInputStream is = new GZipInputStream(response.getEntityInputStream());
然后自己读取的未压缩字节并把它变成一个字符串。
另外,检查服务器是否包含HTTP标头Content-Encoding: gzip
。如果没有,请尝试将其包含在回复中。也许泽西足够聪明地做正确的事情。
谢谢,但如果内容不是GZIPed(即我可以实现一种方法来检测这种情况,具体取决于收到的响应吗?) – Larry
如果您可以依赖服务器正常运行,则可以检查Content-Encoding值。 (或者,响应可能只是设置MIME类型的application/x-gzip。)使用'response.getHeaders()'并测试适当的值。我能想到的另一件事是,如果在一个假设下它似乎是垃圾,那么试试其他的。 –
在新泽西2.x的(我用2.26):
WebTarget target = ...
target.register(GZipEncoder.class);
然后getEntity(String.class)
可以在响应照常使用。
对于泽西岛2.0请参阅http://*.com/questions/17834028/what-is-the-jersey-2-0-equivalent-of-gzipcontentencodingfilter –