7

有人可以告诉我在从一些 Http 调用获得响应时,我需要做什么才能解压缩 GZIP 内容。

要拨打电话,我使用 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??`$?@??????....

如果我可以实现以下内容会很好:

  • 能够检测内容是否经过 GZIP 压缩;
  • 如果不是,则在字符串中正常处理;如果,那么解压缩并获取字符串中的内容
4

3 回答 3

15

只需将GZIPContentEncodingFilter添加到您的客户端:

client.addFilter(new GZIPContentEncodingFilter(false));
于 2011-09-27T19:30:55.657 回答
3

不要将响应作为实体检索。将其作为输入流检索并将其包装在 java.util.zip.GZIPInputStream 中:

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

然后自己读取未压缩的字节并将其转换为字符串。

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

于 2011-09-25T16:27:37.630 回答
1

在 Jersey 2.x(我使用 2.26)中:

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

然后getEntity(String.class)可以像往常一样在响应上使用。

于 2017-12-06T04:48:53.253 回答