2013-05-17 77 views
8

你好同事的java開發者。我收到標題和正文的響應如下,但是當我嘗試使用下面的代碼進行解壓,它失敗與此異常:解壓縮gzip http響應

 
java.io.IOException: Not in GZIP format 

響應:

 
HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Encoding: gzip 
Server: Jetty(6.1.x) 
▼  ═UMs¢0►=7┐ép?╙6-C╚$╢gΩ↓╟±╪₧∟zS╨╓╓♦$FÆ╒÷▀G┬╚╞8N≤╤Cf°►╦█╖╗o↨æJÄ+`:↓2 
♣»└√S▬L&?∙┬_)U╔|♣%ûíyk_à\,æ] hⁿ?▀xΓ∟o╜4♫ù\#MAHG?┤(Q¶╞⌡▌Ç?▼ô[7Fí¼↔φ☻I%╓╣Z♂?¿↨F;x|♦o/A╬♣╘≡∞─≤╝╘U∙♥0☺æ?|J%à{(éUmHµ %σl┴▼Ç9♣┌Ç?♫╡5╠yë~├╜♦íi♫╥╧ 
╬û?▓ε?╞┼→RtGqè₧ójWë♫╩∞j05├╞┘|>┘º∙↑j╪2┐|= ÷² 
eY\╛P?#5wÑqc╙τ♦▓½Θt£6q∩?┌4┼t♠↕=7æƒ╙?╟|♂;║)∩÷≈═^╛{v⌂┌∞◄>6ä╝| 

代碼:

byte[] b= IOUtils.toByteArray(sock.getInputStream()); 

ByteArrayInputStream bais = new ByteArrayInputStream(b); 
GZIPInputStream gzis = new GZIPInputStream(bais); 
InputStreamReader reader = new InputStreamReader(gzis); 
BufferedReader in = new BufferedReader(reader); 

String readed; 
while ((readed = in.readLine()) != null) { 
    System.out.println("read: "+readed); 
} 

請指教。

感謝,

普拉迪普

+0

什麼是「襪子」?如果它是一個套接字,你應該知道頭文件和其他東西沒有被壓縮。只有響應主體是。 –

回答

2

MIME頭是不是在gzip格式,它是純文本格式。您必須先解讀流,然後才能解壓縮流。

而且,爲什麼不使用這樣的:

InputStream in = sock.getInputStream(); 
readHeader(in); 
InputStream zin = new GZIPInputStream(in); 
+0

你能告訴我你的意思嗎?閱讀標題請閱讀頭文件(in); ? – Bill

+1

我的意思是,當你得到一個文件時,你會得到一個頭文件,其中包含像「Content-type:text/html」這樣的包含純文本元數據的東西。每個元數據元素由一個換行符分隔,並且整個標題以2個換行符結束,然後數據開始。 http://en.wikipedia.org/wiki/MIME#MIME_headers –

0

我第二bmarguiles的回答。

只有response-body在RFC)被壓縮,所以你只需要解壓縮是\r\n\r\n後的部分。

一般來說,你可以減少由雙CRLF一半的響應,只解壓縮下半年。