2011-09-25 120 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)可以在響應照常使用。