【Android進階學習】Http編程之HttpClient

在Android開發中,Android SDK附帶了Apache的HttpClient,它是一個完善的客戶端。它提供了對HTTP協議的全面支持,能夠使用HttpClient的對象來執行HTTP GET和HTTP POST調用。java

HTTP工做原理:android

1.客戶端(通常是指瀏覽器,這裏是指本身寫的程序)與服務器創建鏈接apache

2.創建鏈接後,客戶端向服務器發送請求瀏覽器

3.服務器接收到請求後,向客戶端發送響應信息服務器

4.客戶端與服務器斷開鏈接網絡

HttpClient的通常使用步驟:app

1.使用DefaultHttpClient類實例化HttpClient對象ide

2.建立HttpGet或HttpPost對象,將要請求的URL經過構造方法傳入HttpGet或HttpPost對象。post

3.調用execute方法發送HTTP GET或HTTP POST請求,並返回HttpResponse對象。google

4.經過HttpResponse接口的getEntity方法返回響應信息,並進行相應的處理。

最後記得要在AndroidManifest.xml文件添加網絡權限

<uses-permission android:name="android.permission.INTERNET" />

 下面是具體的例子:

1.使用HttpClient來執行GET調用

在LogCat窗口就能看到輸出的信息

package com.lingdududu.http;  
 
import java.io.InputStream;  
 
import org.apache.http.HttpResponse;  
import org.apache.http.HttpStatus;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.DefaultHttpClient;  
 
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
 
public class HttpGetActivity extends Activity {  
    String uri = "http://developer.android.com/";  
    final String TAG_STRING = "TAG";  
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        try {  
            //獲得HttpClient對象  
            HttpClient getClient = new DefaultHttpClient();  
            //獲得HttpGet對象  
            HttpGet request = new HttpGet(uri);  
            //客戶端使用GET方式執行請教,得到服務器端的迴應response  
            HttpResponse response = getClient.execute(request);  
            //判斷請求是否成功    
            if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
                Log.i(TAG_STRING, "請求服務器端成功");  
                //得到輸入流  
                InputStream  inStrem = response.getEntity().getContent();  
                int result = inStrem.read();  
                while (result != -1){  
                    System.out.print((char)result);  
                    result = inStrem.read();  
                }  
                //關閉輸入流  
                inStrem.close();      
            }else {  
                Log.i(TAG_STRING, "請求服務器端失敗");  
            }             
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
}

使用HTTP GET調用有一個缺點就是,請求的參數做爲URL一部分來傳遞,以這種方式傳遞的時候,URL的長度應該在2048個字符以內。若是超出這個這範圍,就要使用到HTTP POST調用。

2.使用HttpClient來執行POST調用

 使用POST調用進行參數傳遞時,須要使用NameValuePair來保存要傳遞的參數。NameValuePair封裝了一個鍵/值組合。另外,還須要設置所使用的字符集。

package com.androidbook.services.httppost;  
 
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.ArrayList;  
import java.util.List;  
 
import org.apache.http.HttpResponse;  
import org.apache.http.NameValuePair;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.entity.UrlEncodedFormEntity;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.message.BasicNameValuePair;  
 
import android.app.Activity;  
import android.os.Bundle;  
 
public class HttpPostActivity extends Activity {  
    String uri = "http://developer.android.com/";  
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
 
        BufferedReader in = null;  
        try {  
            HttpClient client = new DefaultHttpClient();  
            HttpPost request = new HttpPost("http://code.google.com/android/");  
            //使用NameValuePair來保存要傳遞的Post參數  
            List<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
            //添加要傳遞的參數    
            postParameters.add(new BasicNameValuePair("id", "12345"));  
            postParameters.add(new BasicNameValuePair("username", "dave"));  
            //實例化UrlEncodedFormEntity對象  
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(  
                    postParameters);  
 
            //使用HttpPost對象來設置UrlEncodedFormEntity的Entity  
            request.setEntity(formEntity);  
            HttpResponse response = client.execute(request);  
            in = new BufferedReader(  
                    new InputStreamReader(  
                            response.getEntity().getContent()));  
 
            StringBuffer string = new StringBuffer("");  
            String lineStr = "";  
            while ((lineStr = in.readLine()) != null) {  
                string.append(lineStr + "\n");  
            }  
            in.close();  
 
            String resultStr = string.toString();  
            System.out.println(resultStr);  
        } catch(Exception e) {  
            // Do something about exceptions  
        } finally {  
            if (in != null) {  
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}
相關文章
相關標籤/搜索