HTTP訪問的兩種方式(HttpClient+HttpURLConnection)整合匯總對比(轉)


在Android上http 操作類有兩種,分別是HttpClient和HttpURLConnection,其中兩個類的詳細介紹可以問度娘。

HttpClient:

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。HttpClient其實是一個interface類型,已知3個實現類為AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,查看文檔發現DefaultHttpClient也是繼承自AbstractHttpClient。HttpClient封裝了對象需要執行的Http請求、身份驗證、連接管理和其它特性。HttpClient有三個已知的實現類分別是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,會發現有一個專門為Android應用准備的實現類AndroidHttpClient,當然使用常規的DefaultHttpClient也可以實現功能,但是既然開發的是Android應用程序,還是使用Android專有的實現類,一定有其優勢。

HttpClient支持但默認不帶GZIP壓縮,可以自己寫。

使用方法:

 

1. 創建HttpClient對象。

 

2. 創建請求方法的實例,並指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。

 

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

 

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

 

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

 

6. 釋放連接。無論執行方法是否成功,都必須釋放連接

示例:

 

NameValuePair nameValuePair1 = new BasicNameValuePair("name", "yang");
NameValuePair nameValuePair2 = new BasicNameValuePair("pwd","123123");
List nameValuePairs = new ArrayList();
nameValuePairs.add(nameValuePair1);
nameValuePairs.add(nameValuePair2);
String validateURL = "http://10.0.2.2:8080/testhttp1/TestServlet";
try {
        HttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams,5000); //設置連接超時為5秒
        HttpClient client = new DefaultHttpClient(httpParams); // 生成一個http客戶端發送請求對象
        HttpPost httpPost = new HttpPost(urlString); //設定請求方式
          if (nameValuePairs!=null && nameValuePairs.size()!=0) {
              //把鍵值對進行編碼操作並放入HttpEntity對象中
              httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
           }
        HttpResponse httpResponse = client.execute(httpPost); // 發送請求並等待響應
          // 判斷網絡連接是否成功
          if (httpResponse.getStatusLine().getStatusCode() != 200) {
             System.out.println("網絡錯誤異常!!!!");
             return false;
           }
        HttpEntity entity = httpResponse.getEntity(); // 獲取響應里面的內容
        inputStream = entity.getContent();  // 得到服務氣端發回的響應的內容(都在一個流里面)
        // 得到服務氣端發回的響應的內容(都在一個字符串里面)
        // String strResult = EntityUtils.toString(entity); 
      } catch (Exception e) {
   System.out.println("這是異常!");
  }



 

 

HttpURLConnection:

在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能:HttpURLConnection。HttpURLConnection繼承自URLConnection.

HttpURLconnection默認帶GZIP壓縮。

示例:

 

String validateURL="http://10.0.2.2:8080/testhttp1/TestServlet?name=yang&pwd=123123";
try {
       URL url = new URL(validateUrl); //創建URL對象
       //返回一個URLConnection對象,它表示到URL所引用的遠程對象的連接
       HttpURLConnection conn = (HttpURLConnection) url.openConnection();
       conn.setConnectTimeout(5000); //設置連接超時為5秒
       conn.setRequestMethod("GET"); //設定請求方式
       conn.connect(); //建立到遠程對象的實際連接
       //返回打開連接讀取的輸入流
       DataInputStream dis = new DataInputStream(conn.getInputStream());  
      //判斷是否正常響應數據 
        if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
           System.out.println("網絡錯誤異常!!!!");
           return  false;
       }
} catch (Exception e) {
   e.printStackTrace();
   System.out.println("這是異常!");
  } finally {
    if (conn != null) {
     conn.disconnect(); //中斷連接
    }
 }


區別:

 

 功能用法

1、從功能上對比,HttpClient庫要豐富很多,提供了很多工具,封裝了http的請求頭,參數,內容體,響應,還有一些高級功能,代理、COOKIE、鑒權、壓縮、連接池的處理。

2、HttpClient高級功能代碼寫起來比較復雜,對開發人員的要求會高一些,而HttpURLConnection對大部分工作進行了包裝,屏蔽了不需要的細節,適合開發人員直接調用。

3、HttpURLConnection在2.3版本增加了一些HTTPS方面的改進,4.0版本增加一些響應的緩存。

性能

1、HttpUrlConnection直接支持GZIP壓縮;HttpClient也支持,但要自己寫代碼處理。

2、HttpUrlConnection直接支持系統級連接池,即打開的連接不會直接關閉,在一段時間內所有程序可共用;HttpClient當然也能做到,但畢竟不如官方直接系統底層支持好。

3、HttpUrlConnection直接在系統層面做了緩存策略處理(4.0版本以上),加快了重復請求的速度。

4、關於速度方面,網上有些大牛做過測試,但因訪問站點的數據量,二次連接訪問等發現測試結果並不統一,故不做詳述。大體來說相差不是很大。

選用

1、如果一個Android應用需要向指定頁面發送請求,但該頁面並不是一個簡單的頁面,只有當用戶已經登錄,而且登錄用戶的用戶名有效時才可訪問該頁面。如果使用HttpURLConnection來訪問這個被保護的頁面,那么需要處理的細節就太復雜了。可使用HttpClient來登錄系統,只要應用程序使用同一個HttpClient發送請求,HttpClient會自動維護與服務器之間的Session狀態,也就是說程序第一次使用HttpClient登錄系統后,接下來使用HttpClient即可訪問被保護頁而了。這種情況建議使用HttpClient。

2、Android2.3及以上版本建議選用HttpURLConnection,2.2及以下版本建議選用HttpClient,因為貌似2.2下有些小bug,不知現在修復好沒有,但是目前4.0以上版本覆蓋率達89%了,這點應該問題不大。而且api體積小使用更簡單,內存處理方面更適合移動設備,官方也更支持HttpURLClient,想必后續官方會更完善這個,新手或者新的應用都建議使用HttpURLConnection。

 

 

博主初學,此處只是學習筆記以作匯總學習。參考博文,詳情請戳:

http://blog.csdn.net/imzoer/article/details/9447985

http://blog.csdn.net/huzgd/article/details/8712187

http://blog.csdn.net/wangpeng047/article/details/19624529

 

 

 

轉自:鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM