HTTP訪問的兩種方式:HttpURLConnection和HTTPClient的比較

 http://blog.sina.com.cn/s/blog_87216a0001014sm7.htmlhtml

 

http://www.2cto.com/kf/201305/208770.htmljava

------------------------------------------------------------android

http://superonion.iteye.com/blog/1545496瀏覽器

  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發送請求、接收響應很簡單,只要以下幾步便可。
 
  1. 建立HttpClient對象。
  2. 若是須要發送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對象,該對象包裝了服務器的響應內容。程序可經過該對象獲取服務器的響應內容。
       另外, Android已經成功地集成了HttpClient,這意味着開發人員能夠直接在Android應用中使用Httpclient來訪問提交請求、接收響應。
 
好比一個Android應用須要向指定頁面發送請求,但該頁面並非一個簡單的頁面,只有當用戶已經登陸,並且登陸用戶的用戶名有效時纔可訪問該頁面。若是使用HttpURLConnection來訪問這個被保護的頁面,那麼須要處理的細節就太複雜了。
       其實訪問Web應用中被保護的頁面,使用瀏覽器則十分簡單,用戶經過系統提供的登陸頁面登陸系統,瀏覽器會負責維護與服務器之間的Sesion,若是用戶登陸的用戶名、密碼符合要求,就能夠訪問被保護資源了。
       在Android應用程序中,則可以使用HttpClient來登陸系統,只要應用程序使用同一個HttpClient發送請求,HttpClient會自動維護與服務器之間的Session狀態,也就是說程序第一次使用HttpClient登陸系統後,接下來使用HttpClient便可訪問被保護頁而了。
--------------------------------------------------------------

 

1.概念      框架

 

      HTTP 協議多是如今 Internet 上使用得最多、最重要的協議了,愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能:HttpURLConnection。可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。工具

 

      除此以外,在Android中,androidSDK中集成了Apache的HttpClient模塊,用來提供高效的、最新的、功能豐富的支持 HTTP 協議工具包,而且它支持 HTTP 協議最新的版本和建議。使用HttpClient能夠快速開發出功能強大的Http程序。網站

 

2.區別

 

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

 

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

http://hi.baidu.com/wendaoeryu/item/fc2264add98fbde614329bf0

 

-------------------------------------------------------------------------

使用HttpClient:

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:

 

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(); //中斷鏈接

    }

相關文章
相關標籤/搜索