這個建立方法你們應該都很熟悉了,可能會認爲下文中使用的HttpURLConnection的API的實現就在HttpURLConnection中了。這裏要注意一下,其實這個HttpURLConnection是一個抽象類。html
也就是說裏面不少API函數都不在這兒實現的,那在哪實現呢。翻開java源碼,能夠看到,URL.openConnection()的實現是在java.net.URL類中。java
2、HttpURLConnection參數設置最終發現只是簡單的生成了HttpURLConnection對象,其實最重要的HttpURLConnection就在這裏了,這個是sun.net.www.protocl.http.HttpURLConnection類的對象,繼承java.net.HttpURLConnection。也就是說咱們以後所用的API實現都在sun.net.www.protocl.http.HttpURLConnection這個類裏面。因此你們想要看HttpURLConnection的源碼實現的話,須要到這個類中去查看。web
好了,說了這麼多,下面仍是介紹HttpURLConnection經常使用的API的使用吧。緩存
一、設置是否向httpUrlConnection輸出,默認狀況下是false。使用httpUrlConnection.getOutputStream(),把內容輸出到遠程服務器上。服務器
二、設置是否從httpUrlConnection讀入,默認狀況下是true。使用httpUrlConnection.getInputStream(),從遠程服務器上獲得響應的內容。網絡
三、是否使用緩存。app
四、設定傳送的內容類型是可序列化的java對象 (若是不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException)。jsp
五、設定請求的方法爲」POST」,默認是GET 。tcp
1
2
3
|
httpUrlConnection.
connect();
//此處getOutputStream會隱含的進行connect,因此在開發中不調用上述的connect()也能夠
OutputStream outStrm = httpUrlConnection.getOutputStream();
|
1. HttpURLConnection的connect()函數,實際上只是創建了一個與服務器的tcp鏈接,並無實際發送http請求。不管是post仍是get請求,http請求實際上直到HttpURLConnection的getInputStream()這個函數裏面才正式發送出去。因此對outputStream的寫操做,必需要在inputStream的讀操做以前。 2. 在用POST方式發送URL請求時,URL請求參數的設定順序是重中之重,對connection對象的一切配置(那一堆set函數)都必需要在connect()函數執行以前完成。
功能用法對比函數
從功能上對比,HttpClient庫要豐富不少,提供了不少工具,封裝了http的請求頭,參數,內容體,響應,還有一些高級功能,代理、COOKIE、鑑權、壓縮、鏈接池的處理。
HttpClient高級功能代碼寫起來比較複雜,對開發人員的要求會高一些,而HttpURLConnection對大部分工做進行了包裝,屏蔽了不須要的細節,適合開發人員直接調用。
另外,HttpURLConnection在2.3版本增長了一些HTTPS方面的改進,4.0版本增長一些響應的緩存。
性能對比
HttpUrlConnection直接支持GZIP壓縮;HttpClient也支持,但要本身寫代碼處理。
HttpUrlConnection直接支持系統級鏈接池,即打開的鏈接不會直接關閉,在一段時間內全部程序可共用;HttpClient固然也能作到,但畢竟不如官方直接系統底層支持好。
HttpUrlConnection直接在系統層面作了緩存策略處理(4.0版本以上),加快了重複請求的速度。
這篇文章對二者的速度作了一個對比,作法是兩個類都使用默認的方法去請求百度的網頁內容,測試結果是使用httpurlconnection耗時47ms,使用httpclient耗時641ms。httpURLConnection在速度有比較明顯的優點,固然這跟壓縮內容和緩存都有直接關係。
將來發展
HttpClient 適用於 web browsers, 他們是可擴展的,而且擁有大量的穩定APIs。可是,在不破壞其兼容性的前提下很難對如此多的APIs作修改。所以,Android 團隊對修改優化Apache HTTP Client表現的並不積極。
HttpURLConnect 是一個通用的、適合大多數應用的輕量級組件。這個類起步比較晚,很容易在主要API上作穩步的改善。可是HttpURLConnection在在Android 2.2及如下版本上存在一些使人厭煩的bug,尤爲是在讀取 InputStream時調用 close()方法,就有可能會致使鏈接池失效了。
Android團隊將來的工做會將更多的時間放在優化HttpURLConnection上,它的API簡單,體積較小,於是很是適用於Android項目。壓縮和緩存機制能夠有效地減小網絡訪問的流量,在提高速度和省電方面也起到了較大的做用。
選用建議
若是一個Android應用須要向指定頁面發送請求,但該頁面並非一個簡單的頁面,只有當用戶已經登陸,並且登陸用戶的用戶名有效時纔可訪問該頁面。若是使用HttpURLConnection來訪問這個被保護的頁面,那麼須要處理的細節就太複雜了。這種狀況建議使用HttpClient。
Android2.3及以上版本建議選用HttpURLConnection,2.2及如下版本建議選用HttpClient。新的應用都建議使用HttpURLConnection。