Android之Http網絡編程(一)


Android應用作為一個客戶端程序絕大部分都是需要進行網絡請求和訪問的,而http通信是一種比較常見並常用的通信方式。

在Android中http網絡編程中有兩種實現方式,一種是使用HttpURLConnection,另一種就是使用HttpClient。

這兩種實現方式的大體過程都是:

  1. Android客戶端向服務器發出請求。
  2. 服務端接收請求並響應。
  3. 服務端返回數據給客戶端。

在Http通信中有POST和GET兩種方式,其不同之處在於GET方式可以獲得靜態頁面,同時可以將請求參數放在URL字符串后面,傳遞給服務器;而POST方式的參數則是放在Http請求中的。因此,無論你是用哪一種HTTP實現方式都需要明確所使用的請求方式。

 

下面我們我們先來認識HttpURLConnection:

HttpURLConnection繼承於URLConnection類,二者都是抽象類。其對象主要通過URL對象的openConnection方法創建,在獲得HttpURLConnection對象之后,默認采用GET方式請求數據,此時即可使用輸入流讀取信息。

示例如下:(其中strurl為“http://www.baidu.com”)

private HttpURLConnection conn;

URL url = new URL(strurl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//設置請求方式
conn.setConnectTimeout(6 * 1000);//設置連接超時的時間
conn.setReadTimeout(8000);//設置讀取超時的毫秒數
if (conn.getResponseCode() != 200)//判斷是否請求成功
          throw new RuntimeException("運行異常");
//獲取服務器返回的輸入流
InputStream is = conn.getInputStream();

如果使用POST方式,還需要對一些參數進行設置(包括上面示例中的一些設置,除此之外還有以下常見設置)。

          conn.setConnectTimeout(6 * 1000);//設置連接超時的時間
                    conn.setReadTimeout(8000);//設置讀取超時的毫秒數
                    conn.setDoOutput(true);//是否允許輸出
                    conn.setUseCaches(false);//是否使用緩存
                    conn.setRequestMethod("POST");//設置請求方式
                    conn.setInstanceFollowRedirects(true);//是否自動執行http重定向
                    //以下設置一般請求屬性,即網頁的頭部信息
                    conn.setRequestProperty("Charset", "UTF-8");
                 conn.setRequestProperty("Connection", "Keep-Alive");
                 conn.setRequestProperty("Content-Type", "application/x-www-from-urlencoded");
                 conn.setRequestProperty("Content-Length", String.valueOf(data.length));

HttpURLConnection根據使用目的不同,在具體使用時會稍有區別。下面,就常見的幾種應用舉例說明。

  1.  從Internet獲取網頁,即向URL發送請求,將網頁以流的形式讀回本地。
  2. 從Internet獲取文件,即利用HttpURLConnection對象從網絡中獲取文件數據。
  3. 向Internet發送請求參數,即向服務器傳遞參數,即向服務器傳遞參數。
  4. 向Internet傳送XML數據。(使用HTTP的的方式傳輸文件,一般文件大小在5M一下,HTTP通信方式不適合傳輸大文件,對大文件的傳輸最好使用Socket通信方式,以保證程序的穩定性。)

 下面我們以第一種為例:

static String strurl = "http://www.baidu.com";

public static void testHttpUrlConnection() {
        new Thread(new Runnable() {
            private HttpURLConnection conn;

            public void run() {
                
                try {
                    URL url = new URL(strurl);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");//設置請求方式
                    conn.setConnectTimeout(6 * 1000);//設置連接超時的時間
                    conn.setReadTimeout(8000);//設置讀取超時的毫秒數
                    
                    if (conn.getResponseCode() != 200)//判斷是否請求成功
                        throw new RuntimeException("運行異常");
                    //獲取服務器返回的輸入流
                    InputStream is = conn.getInputStream();
                    String str = convertStreamToString(is);
                    System.out.println("HttpUrlConnection方式"+str);

                } catch (Exception e) {
                    System.out.println("utils異常");
                    e.printStackTrace();
                }
                //關閉http鏈接
                conn.disconnect();
            }
        }).start();

    }

 

將流轉換成字符串

/**
     * 將流轉換成字符串
     * 
     * @param is
     * @return
     */
    public static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the
         * BufferedReader.readLine() method. We iterate until the BufferedReader
         * return null which means there's no more data to read. Each line will
         * appended to a StringBuilder and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }

 

 

運行程序,測試結果如下:

獲取網頁成功。

 

接下來,我們來簡單的認識HttpClient:

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。

httpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性。它不僅是客戶端發送Http請求變得容易,而且也方便了開發人員測試接口(基於Http協議的),即提高了開發的效率,也方便提高代碼的健壯性。

 

我們用HttpClient實現上面HttpURLConnection獲取百度網頁的同樣的功能。

public static void testHtppClient() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet(strurl);
                HttpResponse response;

                try {
                    response = client.execute(request);
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        String str = EntityUtils.toString(response.getEntity());
                        System.out.println("HtppClient實現方式"+str);
                    }

                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();
    }

結果如下:

 

目前,兩種http通信的最常見的最簡單的使用我們都會了。至於這兩種通信方式的更進一步的使用,需要我們大家更進一步的學習和理解,加油!

注意:如果要將獲取到的網絡數據添加到界面上,需要使用到Android的異步消息處理機制。因為對網絡的操作屬於耗時操作,為了不阻塞主線程我們一般新開一個新的線程來執行網絡請求。然而,只有主線程(即UI線程)可以更新界面,因此我們獲取的網絡數據通過異步消息處理機制從子線程傳遞到主線程,並最終實現更新UI。

對異步消息處理機制不熟悉的話 ,可以參考另外兩篇博文《Android線程與異步消息處理機制》、《Android 在子線程中更新UI》。

 

 

DEMO下載:http://download.csdn.net/detail/af74776/7994837


免責聲明!

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



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