【轉】 Pro Android學習筆記(七二):HTTP服務(6):HttpURLConnection

來源:互聯網
上載者:User

標籤:

目錄(?)[-]

  1. Http Get的使用方式
    1. 基礎小例子
    2. Cookie的使用
    3. 重新導向
  2. HTTP POST的小例子
    1. 基礎小例子

文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件,轉載須註明出處:http://blog.csdn.net/flowingflying/

之前我們都是使用HttpClient來進行http串連,在上一次學習中,HttpClient遠比封裝socket要來得複雜,有管理器,有串連池。從Android2.3版本開始,可以是java.net.HttpURLConnection提供更小更輕載的串連服務。具體詳見:http://developer.android.com/reference/java/net/HttpURLConnection.html

Http Get的使用方式基礎小例子

private void httpUrlConnGetTest(){ 
    HttpURLConnection urlConn = null; 
    try{  
        URL url = new URL("http://www.android.com/");  
         
        /* 【1】 擷取HttpURLConnection的對象。通過調用URL.openConnection(),並將類型適配為HttpURLConnection類型。 如果是處理https,則使用HttpsURLConnecction,相關的代碼參考: http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html */
        urlConn = (HttpURLConnection) url.openConnection(); 
        
        /* 【2】 處理request的header,設定逾時屬性 。 */
        urlConn.setRequestProperty("private-Hello", "Hello world!");//加入屬性測試 
        urlConn.setConnectTimeout(3000);  //對應connection timeout
        urlConn.setReadTimeout(5000); //對應Socket timeout
        
        /* 【3】 處理request的body。HTTP Get 沒有body,相關的在HTTP POST中示範 */
         
        /* 【4】讀取response。*/ 
        // 【4.1】擷取response code測試  
        int responseCode = urlConn.getResponseCode();  
        Log.d("PRO","Response code = " + responseCode);
        if(responseCode == HttpURLConnection.HTTP_OK){  
            Log.d("PRO","測試擷取頭資訊Content-Type:" + urlConn.getContentType()); //【4.2】擷取header資訊測試 
            // 讀取body 
            BufferedReader in = new BufferedReader( 
                    new InputStreamReader( 
                            urlConn.getInputStream()));             
            String line = null; 
            while((line = in.readLine()) != null ){  
                Log.d("PRO",line); 
            } 
            in.close(); 
        } 
    }catch(Exception e){  
        e.printStackTrace();      
    }finally{ 
        /* 【5】 中斷連線。*/  
        if(urlConn != null) 
            urlConn.disconnect(); 
    } 

HttpURLConnection看起來真整個設計更貼近底層的TCP的流概念。從抓包情況看,已經成功地增加自訂的頭欄位:private-Hello: Hello world!。我們可以根據所需屬性,構造http請求訊息。HttpURLConnectoion也支援401的認證,不過現在基本上很少用這種認證方式,SIP還在用。

Cookie的使用

// 通過CookieHander和CookieManager,HttpURLConnection包含一個格外的cookie管理器,以此在client和server件維護一個長期的session。這部分的代碼來自reference。
CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 
//寫和讀cookie的小例子 
HttpCookie cookie = new HttpCookie("lang", "fr"); 
cookie.setDomain("twitter.com"); 
cookie.setPath("/"); 
cookie.setVersion(0); 
cookieManager.getCookieStore().add(new URI("http://twitter.com/"), cookie);

重新導向

HttpURLConnection可以自動處理重新導向的情況,對代碼進行修改來進行相關測試。HttpURLConnection最多可支援5次重新導向(估計是防止迴圈),但不能跨scheme,即不能重http重新導向到https,反之亦然,原因很簡單,因為http和https是由不同的類來進行處理。當然瀏覽器是支援跨scheme的重新導向。HttpURLConnection會自動根據302 Found訊息給出的Location資訊進行串連。

URL url = new URL("http://www.google.com/");     //將被重新導向到www.google.com.hk 
... ...               
/* 4、讀取response */    
if(!url.getHost().equals(urlConn.getURL().getHost())) //比較請求的url和實際的url 
    Log.d("PRO","Redirect to " + urlConn.getURL().getHost()); 
… … 

HTTP POST的小例子基礎小例子

如果設定了setDoOutput(true),這說明是HTTP POST。如果是其他的,例如OPTIONS,HEAD,PUT,DELETE和TRACE,可以通過setRequestMethod(String)來進行設定,無非就是確定status line如何寫。

private void httpUrlConnPostTest(){ 
    HttpURLConnection urlConn = null; 
    try{  
        URL url = new URL("http://blog.csdn.net/flowingflying1");//這是個無效的地址,預計回複403 
        urlConn = (HttpURLConnection) url.openConnection(); 
                   
        /* 【3】 處理request的body */   
        urlConn.setDoOutput(true);
  // 設定允許output,即可以帶有request body 
        // 為了效能更好,應該設定setFixedLengthStreamingMod(int)或者setChunkedStramingMode(int)。如果不設定,request將的帶buffer已經完成body的寫,再發送,這對body資料量大的情況下顯然效率較低。
       urlConn.setChunkedStreamingMode(0);    
       
// 通過outstream,寫入body  
        OutputStream out = new BufferedOutputStream(urlConn.getOutputStream());
        String content = "user=myfriend&action=TEST"; 
        out.write(content.getBytes()); 
        out.close(); 
        
        /* 4、讀取response。*/  
        if(urlConn.getResponseCode()  = HttpURLConnection.HTTP_OK){ 
            BufferedReader in = new BufferedReader( 
                    new InputStreamReader( 
                            urlConn.getInputStream()));              
            String line = null; 
            while((line = in.readLine()) != null ){  
                Log.d("PRO",line); 
            } 
            in.close(); 
        } 
    }catch(Exception e){  
        e.printStackTrace();         
    }finally{  
        if(urlConn != null) 
            urlConn.disconnect(); 
    } 

本博文涉及的例子代碼,可以在Pro Android學習:Http service小例子中下載。

相關連結: 我的Android開發相關文章

【轉】 Pro Android學習筆記(七二):HTTP服務(6):HttpURLConnection

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.