1. 程式人生 > >Http gzip 處理

Http gzip 處理

java實現html網頁的gzip解壓

在對網頁抓包中發現,返回的很多網頁是經過壓縮的,比如訪問谷歌首頁,返回的標頭檔案中包含Content-Encoding gzip

使用gzip可以省下很多網頁流量,在網速一定的情況下,可以提高訪問效率,我們用java訪問時如何可以得到gzip的返回,並且我們如何解析返回的gzip呢?

我們以訪問http://www.baidu.com/為例
我們用URL的openStream方法直接訪問時並不返回gzip壓縮資料,這是因為時候返回gzip需要判斷瀏覽器是否支援gzip壓縮,所以我們請求資料的時候在http請求頭中新增支援gzip的請求頭就可以
新增conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);就告訴伺服器你的瀏覽器支援gzip解壓了

URL url = new URL(“http://www.baidu.com/”);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);
conn.connect();

InputStream in = conn.getInputStream();

BufferedReader bin = new BufferedReader(new InputStreamReader(in, “GB2312”));
String s = null;
while((s=bin.readLine())!=null){
System.out.println(s);
}
bin.close();

沒有conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);不會出現亂碼

加上conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);就是亂碼,這事因為伺服器對返回內容進行了gzip壓縮的緣故,我們只要判斷返回頭是否包含Content-Encoding gzip,就可以判斷是不是壓縮過的資料,對待壓縮後的資料我們只需進行gzip解壓就好了

只需將上面的程式碼加上
GZIPInputStream gzin = new GZIPInputStream(in);
並將
BufferedReader bin = new BufferedReader(new InputStreamReader(in, “utf-8”));
改為
BufferedReader bin = new BufferedReader(new InputStreamReader(gzin, “utf-8”));

當然是否需要gzip解壓,只判斷返回資料頭是否包含Content-Encoding gzip就可以了