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, "GB2312")); 改為 BufferedReader bin = new BufferedReader(new InputStreamReader(gzin, "GB2312"));
當然是否需要gzip解壓,只判斷返回數據頭是否包含Content-Encoding gzip就可以了