Распакуйте HTTP-ответ GZIP (используя jersey client api, java) - PullRequest
5 голосов
/ 25 сентября 2011

Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы распаковать содержимое GZIP при получении ответа от какого-либо Http-вызова.

Чтобы сделать вызов, я использую клиентский API Jersey, см. Код ниже:

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 или нет;
  • Если нет, обработайте как обычно в String;если, то распакуйте и получите содержимое в String

Ответы [ 3 ]

14 голосов
/ 27 сентября 2011

Просто добавьте GZIPContentEncodingFilter своему клиенту:

client.addFilter(new GZIPContentEncodingFilter(false));
3 голосов
/ 25 сентября 2011

Не получать ответ как сущность. Получить его как входной поток и обернуть его в java.util.zip.GZIPInputStream:

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

Затем прочитайте несжатые байты самостоятельно и превратите их в строку.

Также проверьте, содержит ли сервер заголовок HTTP Content-Encoding: gzip. Если нет, попробуйте включить его в ответ. Возможно, Джерси достаточно умен, чтобы поступать правильно.

0 голосов
/ 06 декабря 2017

В Джерси 2.x (я использую 2.26):

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

Тогда getEntity(String.class) можно использовать в ответе как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...