Android 網絡編程(二)HttpClient

上一篇說了HTTP協議,這篇主要說一下HTTP請求所要使用的類,HttpClient。


HttpClient簡介

HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。

HttpClient 提供的主要的功能如下:

  1. 實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  2. 支持自動轉向
  3. 支持 HTTPS 協議
  4. 支持代理服務器等

HttpClient 請求

使用 HttpClient 需要以下 6 個步驟:
1. 創建 HttpClient 的實例
2. 創建某種連接方法的實例,在這裏是GetMethod。在 GetMethod 的構造函數中傳入待連接的地址
3. 調用第一步中創建好的實例的 execute 方法來執行第二步中創建好的 method 實例
4. 讀 response
5. 釋放連接。無論執行方法是否成功,都必須釋放連接
6. 對得到後的內容進行處理

Get請求

class HttpClientGetThread extends Thread{
    @Override
    public void run() {
        HttpResponse response;
        InputStream in = null;
        // 默認的HttpClient實例
        HttpClient httpClient = new DefaultHttpClient();
        // 創建HttpGet實例
        HttpGet get = new HttpGet("http://www.baidu.com");

        try {
            //連接到服務器
            response = httpClient.execute(get);
            if(response.getStatusLine().getStatusCode()==200){
                HttpEntity entity = response.getEntity();
                Header contentType = entity.getContentType();
                if(contentType != null)
                Log.i(TAG, "name="+contentType.getName()+",value="+contentType.getValue());
                long length = entity.getContentLength();
                Log.i(TAG, "length="+length);
                //獲取輸入流
                in = entity.getContent();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        final String content = readStreamToString(in);
        mTvResponse.post(new Runnable() {
            @Override
            public void run() {
                //更新ui
                mTvResponse.setText(content);
            }
        });
    }
}

readStreamToString用來從輸入流中讀取數據。

private String readStreamToString(InputStream is){
    if(is == null)return null;
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is));
    String content = "";
    String line = "";
    try {
        //從輸入流讀取數據,readLine方法會阻塞,直到有數據返回,或者連接斷開。
        while ((line = reader.readLine()) != null) {
            content += line;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return content;
}

效果圖如下:
這裏寫圖片描述

Post請求

class HttpClientPostThread extends Thread{
    @Override
    public void run() {
        HttpResponse response;
        InputStream in = null;
        // 默認的HttpClient實例
        HttpClient httpClient = new DefaultHttpClient();
        // 創建HttpPost實例
        HttpPost post = new HttpPost("http://120.25.226.186:32812/login");

        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            //設置參數
            params.add(new BasicNameValuePair("username", "520it"));
            params.add(new BasicNameValuePair("pwd", "520it"));
            post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            //連接到服務器
            response = httpClient.execute(post);
            if(response.getStatusLine().getStatusCode()==200){
                HttpEntity entity = response.getEntity();
                Header contentType = entity.getContentType();
                if(contentType != null)
                    Log.i(TAG, "name="+contentType.getName()+",value="+contentType.getValue());

                //獲取輸入流
                in = entity.getContent();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        final String content = readStreamToString(in);
        Log.i(TAG, "post content:"+content);
    }
}

打印結果如下:

07-30 17:23:53.867: I/MainActivity(5329): name=Content-Type,value=application/json;charset=UTF-8
07-30 17:23:53.868: I/MainActivity(5329): post content:{"success":"登錄成功"}

歡迎大家關注、評論、點贊
你們的支持是我堅持的動力。

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