Android中的HTTP請求
在Android上傳送HTTP請求的方式一般有兩種,HttpURLConnection和HttpClient。
1、HttpURLConnection:
首先需要獲取HttpURLConnection的例項,一般只需要new一個URL物件並傳入目標的網路地址,讓背後呼叫openConnection()方法即可:
URL url=new URL("http://www.baidu.com");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
設定HTTP請求使用的方法,常用的方法主要有兩個:GET和POST。
conn.setRequestMethod("GET");
設定連線超時毫秒數
conn.setConnectionTimeout(5000);
設定讀取超時毫秒數
conn.setReadTimeout(5000);
之後呼叫getInputStream()方法就可以獲取到伺服器返回的輸入流了
InputStream in=conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer stringBuffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
Log.d("TAG",stringBuffer.toString());
關閉HTTP連線
conn.disconnect();
如果是想提交資料給伺服器,之需要將HTTP請求的方法改為POST,並在獲取輸入流之前把要提交的資料寫出即可,注意每條資料都要以鍵值對的形式存在,資料與資料之間用&符號隔開:
conn.setRequestMethod("POST");
DataOutputStream out =new DataOutputStream(conn.getOutputStream());
out.writeBytes("username=admin&password=123456");
2、HttpClient
HttpClient可以完成和HttpURLConnection幾乎一模一樣的功能,但兩者的用法卻有較大的差別。
HttpClient是一個介面,因此無法建立它的例項,通常情況下會建立一個DefaultHttpClient的例項:
HttpClient httpClient=new DefaultHttpClient();
如果想要發起一條GET請求,可以建立一個HttpGet物件,並傳入目標的網路地址,然後呼叫HttpClient的execute()方法即可:
HttpGet httpGet=new HttpGet("http://www.taobao.com");
HttpResponse httpResponse=httpClient.execute(httpGet);
如果是POST請求,胡比GET請求稍微複雜一點,我們需要建立一個HttpPost物件,並傳入目標的網路地址:
HttpPOST httpPost=new HttpPost("http://www.taobao.com");
然後通過一個NameValuePair集合存放待提交的引數,並將這個引數集合傳入到一個UrlEncodedFormEntity中,然後呼叫HttpPost的setEntity()方法將構建好的UrlEncodedFormEntity傳入:
List<NameValuePair> params=new ArrayList<NameValuePair>();
params.add(new NameValuePair("username","admin"));
params.add(new NameValuePair("password","123456"));
UrlEncodedFormEntity entity=new UrlEncodedFormEntity(params,"utf-8");
httpPost.setEntity(entity);
接下來的操作和HttpGet一樣了,呼叫HttpClient的execute()方法,並將HttpPost物件傳入即可:
HttpResponse httpResponse=httpClient.execute(httpPost);
執行excute()方法後會返回一個HttpResponse物件,伺服器返回的資訊就會包含在裡面,通常情況下,我們都會先去除伺服器返回的狀態碼,如果等於200就說明請求和相應都成功了。
if(httpResponse.getStatusLine().getStatusCode()==200){
//請求和相應都成功了
}
接下來在這個if判斷的內部取出伺服器的具體內容,可以呼叫getEntity()方法獲得到一個HttpEntity例項,然後再呼叫EntityUtils.toString()方法將HttpEntity轉換成字串即可:
HttpEntity entity=httpResponse.getEntity();
String response=EntityUtils.toString(entity);
如果返回的資料中帶有中文,需要指定字元編碼集為utf-8,否則會出現亂碼:
String str=EntityUtils.toString(entity,"utf-8");