當前位置:編程學習大全網 - 源碼下載 - HttpClient和HttpURLConnection的區別

HttpClient和HttpURLConnection的區別

總結了網上的壹些資源,主要有以下兩個觀點:

分析壹:

在研究Volley框架的源碼中,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較好奇這麽使用的原因,於是專門找到了壹位Google的工程師寫的壹篇博客,文中對HttpURLConnection和HttpClient進行了對比,下面我就給大家簡要地翻譯壹下。

大多數的Android應用程序都會使用HTTP協議來發送和接收網絡數據,而Android中主要提供了兩種方式來進行HTTP操作,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協議、以流的形式進行上傳和下載、配置超時時間、IPv6、以及連接池等功能。

HttpClient:

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現類,它們都擁有眾多的API,而且實現比較穩定,bug數量也很少。

但同時也由於HttpClient的API數量過多,使得我們很難在不破壞兼容性的情況下對它進行升級和擴展,所以目前Android團隊在提升和優化HttpClient方面的工作態度並不積極。

HttpURLConnection:

HttpURLConnection是壹種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程序。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴展它。

不過在Android 2.2版本之前,HttpURLConnection壹直存在著壹些令人厭煩的bug。比如說對壹個可讀的InputStream調用close()方法時,就有可能會導致連接池失效了。那麽我們通常的解決辦法就是直接禁用掉連接池的功能:

[java] view plaincopy

[java] view plaincopy

private void disableConnectionReuseIfNecessary() {

// 這是壹個2.2版本之前的bug

if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {

System.setProperty(". 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能:HttpURLConnection。

HttpURLConnection是java的標準類,HttpURLConnection繼承自URLConnection,可用於向指定網站發送GET請求、POST請求。它在URLConnection的基礎上提供了如下便捷的方法:

int getResponseCode():獲取服務器的響應代碼。

String getResponseMessage():獲取服務器的響應消息。

String getResponseMethod():獲取發送請求的方法。

void setRequestMethod(String method):設置發送請求的方法。

在壹般情況下,如果只是需要Web站點的某個簡單頁面提交請求並獲取服務器響應,HttpURLConnection完全可以勝任。但在絕大部分情況下,Web站點的網頁可能沒這麽簡單,這些頁面並不是通過壹個簡單的URL就可訪問的,可能需要用戶登錄而且具有相應的權限才可訪問該頁面。在這種情況下,就需要涉及Session、Cookie的處理了,如果打算使用HttpURLConnection來處理這些細節,當然也是可能實現的,只是處理起來難度就大了。

為了更好地處理向Web站點請求,包括處理Session、Cookie等細節問題,Apache開源組織提供了壹個HttpClient項目,看它的名稱就知道,它是壹個簡單的HTTP客戶端(並不是瀏覽器),可以用於發送HTTP請求,接收HTTP響應。但不會緩存服務器的響應,不能執行HTML頁面中嵌入的Javascript代碼;也不會對頁面內容進行任何解析、處理。

簡單來說,HttpClient就是壹個增強版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關註於如何發送請求、接收

響應,以及管理HTTP連接。

使用HttpClient發送請求、接收響應很簡單,只要如下幾步即可。

創建HttpClient對象。

如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。

如果需要發送請求參數,可調用HttpGet、HttpPost***同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。

調用HttpClient對象的execute(HttpUriRequest request)發送請求,執行該方法返回壹個HttpResponse。

調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。

另外,Android已經成功地集成了HttpClient,這意味著開發人員可以直接在Android應用中使用Httpclient來訪問提交請求、接收響應。

比如壹個Android應用需要向指定頁面發送請求,但該頁面並不是壹個簡單的頁面,只有當用戶已經登錄,而且登錄用戶的用戶名有效時才可訪問該頁面。如果使用HttpURLConnection來訪問這個被保護的頁面,那麽需要處理的細節就太復雜了。

其實訪問Web應用中被保護的頁面,使用瀏覽器則十分簡單,用戶通過系統提供的登錄頁面登錄系統,瀏覽器會負責維護與服務器之間的Sesion,如果用戶登錄的用戶名、密碼符合要求,就可以訪問被保護資源了。

在Android應用程序中,則可使用HttpClient來登錄系統,只要應用程序使用同壹個HttpClient發送請求,HttpClient會自動維護與服務器之間的Session狀態,也就是說程序第壹次使用HttpClient登錄系統後,接下來使用HttpClient即可訪問被保護頁而了。

  • 上一篇:魔力寶貝FZ腳本這麽寫?
  • 下一篇:什麽是網站優化?
  • copyright 2024編程學習大全網