Android中主要提供了兩種方式來進行HTTP操作,HttpURLConnection和AndroidHttpClient。
(一)HttpURLConnection
1、HttpURLConnection 是Sun公司提供的網絡連接庫,提供通用性、輕量級的網絡連接,簡單,但可擴展性強,基本的網絡請求都滿足,同時支持IPv6、代理、授權、Cookies等。
2、支持壓縮功能,自動在請求頭中加入Accept-Encoding: gzip,但在getContentLength()中獲取到的是壓縮後的數據長度,要獲取實際長度需要讀取整個流自己計算。
3、2.2之前存在連接池失效問題,如讀取流失敗或未完成,後面繼續使用時會讀取到髒數據。可以禁用連接池功能。
private void disableConnectionReuseIfNecessary() {
// 這是一個2.2版本之前的bug
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
4、android 開發團隊對 HttpURLConnectioin 比較重視,2.3版本增加 https 的改進,以及一些壓縮和會話的機制。如果連接失敗,它會自動去嘗試重新進行連接。
緩存原理簡單介紹:
(1)緩存利用http 頭的Cache-Control,判斷是否失效,未失效或無網絡直接讀取上次緩存,緩存一般存放於磁盤中。
(2)利用 http 頭的If-Modified-Since或If-None-Match,請求數據到服務器,服務器根據If-Modified-Since或If-None-Match的值判斷是否數據失效,未失效返回304狀態,失效返回新的數據。
在 android 網絡連接框架Volley
中自己實現了一套類似的 http cache。
6、請求時自動在 http 頭加入手機信息User-Agent。
(二)AndroidHttpClient
1、AndroidHttpClient是Apache公司提供的庫,封裝了http的請求,參數,內容體,響應等,擁有衆多API,但是因封裝過多較冗餘,很難擴展的同時兼容,目前已很少更新,5.1中已經被棄用。
(三)對比
1、HttpURLConnectioin支持壓縮(gzip)和緩存(4.0以後),AndroidHttpClient 不支持,分別用這兩 api 請求百度地址抓取數據如下
可見壓縮後速度和傳輸數據量都減少,提升了網絡請求性能。
2、android 開發團隊已經棄用AndroidHttpClient,建議2.3以前使用 AndroidHttpClient,2.3(含)以後使用HttpURLConnectioin,新項目直接使用HttpURLConnectioin。