Распаковать GZIP http-ответ (используя jersey client api, java)

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

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

person Larry    schedule 25.09.2011    source источник
comment
Для Джерси 2.0 см. gzipcontentencodingfilter"> stackoverflow.com/questions/17834028/   -  person Paul Bellora    schedule 24.10.2016


Ответы (3)


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

client.addFilter(new GZIPContentEncodingFilter(false));
person Martin Matula    schedule 27.09.2011

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

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

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

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

person Ted Hopp    schedule 25.09.2011
comment
спасибо, но что, если содержимое не сжато с помощью GZIP (т. е. могу ли я реализовать способ обнаружения этого в зависимости от полученного ответа?) - person Larry; 25.09.2011
comment
Если вы можете рассчитывать на правильное поведение сервера, вы можете проверить значение Content-Encoding. (В качестве альтернативы ответ может просто установить MIME-тип application/x-gzip.) Используйте response.getHeaders() и проверьте соответствующие значения. Единственная другая вещь, о которой я могу думать, это то, что если это кажется мусором при одном предположении, попробуйте другое. - person Ted Hopp; 25.09.2011

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

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

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

person Vikas    schedule 06.12.2017
comment
В клиенте 2.x нет метода getEntity(Class). Есть метод readEntity(Class). - person Paul Samsotha; 15.02.2021