HttpURLConnection和HttpClient比較

1、HttpClient比HttpURLConnection功能更強大,但是做java建議用前者,安卓建議用後者

2、這兩者都支持HTTPSstreaming 上傳與下載,配置超時時間,IPv6, 以及連接池。

3.區別

HttpClient是個很不錯的開源框架,封裝了訪問http的請求頭,參數,內容體,響應等等,

HttpURLConnection是java的標準類,什麼都沒封裝,用起來太原始,不方便,比如重訪問的自定義,以及一些高級功能等。

4、Android5.1之後就廢止了HttpClient的相關Api

5、

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

HttpClient更方便更強大的解決了HttpURLConnection能做到或者不能做到的事情,HttpClient模塊提供的兩大類HttpPost和HttpGet實現Http請求:

       HttpPost —— 傳送的數據量較大,一般被默認爲不受限制。一般用於發送一些表單數據,傳輸數據更安全

       HttpGet —— 傳送的數據量較小,不能大於2KB。一般用於請求獲取一些信息,執行效率更高


6、

哪一種纔是最好的?

在Android 2.2版本之前、HttpClient擁有較少的bug、因此使用它是最好的選擇、而在Android 2.3版本及以後、HttpURLConnection則是最佳的選擇、它的API簡單、體積較小、因而非常適用於Android項目、壓縮和緩存機制可以有效地減少網絡訪問的流量、在提升速度和省電方面也起到了較大的作用、對於新的應用程序應該更加偏向於使用HttpURLConnection、因爲在以後的工作當中我們也會將更多的時間放在優化HttpURLConnection上面、其實我們也可以使用另外一個框架Volley


關於Volley

我們平時在開發Android應用的時候不可避免地都需要用到網絡技術、而多數情況下應用程序都會使用HTTP協議來發送和接收網絡數據、Android系統中主要提供了兩種方式來進行HTTP通信、HttpURLConnection和HttpClient、幾乎在任何項目的代碼中我們都能看到這兩個類的身影、使用率非常高

不過HttpURLConnection和HttpClient的用法還是稍微有些複雜的、如果不進行適當封裝的話、很容易就會寫出不少重複代碼、於是乎、一些Android網絡通信框架也就應運而生、比如說AsyncHttpClient、它把HTTP所有的通信細節全部封裝在了內部、我們只需要簡單調用幾行代碼就可以完成通信操作了、再比如Universal-Image-Loader、它使得在界面上顯示網絡圖片的操作變得極度簡單、開發者不用關心如何從網絡上獲取圖片、也不用關心開啓線程、回收圖片資源等細節、Universal-Image-Loader已經把一切都做好了

Android開發團隊也是意識到了有必要將HTTP的通信操作再進行簡單化、於是在2013年Google I/O大會上推出了一個新的網絡通信框架——Volley、Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集於了一身

既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信、也可以像Universal-Image-Loader一樣輕鬆加載網絡上的圖片、除了簡單易用之外、Volley在性能方面也進行了大幅度的調整、它的設計目標就是非常適合去進行數據量不大、但通信頻繁的網絡操作、而對於大數據量的網絡操作、比如說下載文件等、Volley的表現就會非常糟糕

下圖所示的這些應用都是屬於數據量不大、但網絡通信頻繁的、因此非常適合使用Volley

Volley主頁:https://android.googlesource.com/platform/frameworks/volley


6、兩種訪問方式編碼

     

使用HttpClient:

NameValuePair nameValuePair1 = newBasicNameValuePair("name", "yang");
NameValuePair nameValuePair2 = newBasicNameValuePair("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 = newDefaultHttpClient(httpParams); //生成一個http客戶端發送請求對象

       HttpPost httpPost = newHttpPost(urlString); //設定請求方式

         if (nameValuePairs!=null&& nameValuePairs.size()!=0){
             //把鍵值對進行編碼操作並放入HttpEntity對象中
             httpPost.setEntity(newUrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
          }

       HttpResponse httpResponse =client.execute(httpPost); // 發送請求並等待響應

          //判斷網絡連接是否成功
         if (httpResponse.getStatusLine().getStatusCode()!= 200) {
            System.out.println("網絡錯誤異常!!!!");

             returnfalse;
           }

       HttpEntity entity = httpResponse.getEntity(); // 獲取響應裏面的內容
       inputStream = entity.getContent();  //得到服務氣端發回的響應的內容(都在一個流裏面)
       // 得到服務氣端發回的響應的內容(都在一個字符串裏面)
       // String strResult =EntityUtils.toString(entity); 

      }catch (Exception e) {
   System.out.println("這是異常!");
  }

 

 

使用HttpURLConnection:

 

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(); //建立到遠程對象的實際連接

      //返回打開連接讀取的輸入流

       DataInputStreamdis = newDataInputStream(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(); //中斷連接
    }
 }




更多解釋可以看我的收藏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章