網路連線之——HttpClient(doGet和doPost)
1.概述:
我們平時在開發Android應用的時候不可避免地都需要用到網路技術,而多數情況下應用程式都會使用HTTP協議來發送和接收網路資料。當然有時也用URLConnection。
Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和HttpClient,幾乎在任何專案的程式碼中我們都能看到這兩個類的身影,使用率非常高。
但在android6.0之後,HttpClient被完全拋棄。如果要繼續使用需要Apache HttpClient,需要在eclipse下libs裡新增org.apache.http.legacy.jar,android studio裡在相應的module下的build.gradle中加入:
android {
useLibrary ‘org.apache.http.legacy’
}
HttpClient和HttpURLConnection一樣有doGet和doPost兩種方式,這裡僅介紹一下doGet方法,doPost方法仍舊和JAVA中學習的一樣,如果忘記了可以看一下:doGet和doPost
資料:
HttpClient其實是一個interface型別,HttpClient封裝了物件需要執行的Http請求、身份驗證、連線管理和其它特性。從文件上看,HttpClient有三個已知的實現類分別是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,會發現有一個專門為Android應用準備的實現類AndroidHttpClient,當然使用常規的DefaultHttpClient也可以實現功能,但是既然開發的是Android應用程式,還是使用Android專有的實現類,一定有其優勢。
從兩個類包所有在位置就可以看出區別,AndroidHttpClient定義在android.net.http.AndroidHttpClient包下,屬於Android原生的http訪問,而DefaultHttpClient定義在org.apache.http.impl.client.DefaultHttpClient包下,屬於對apche專案的支援。而AndroidHttpClient沒有公開的建構函式,只能通過靜態方法newInstance()方法來獲得AndroidHttpClient物件。
因為Android4.0之後對使用網路有特殊要求,已經無法再在主執行緒中訪問網路了,必須使用多執行緒訪問的模式
2.doGet方法:
這裡使用一個範例來介紹一下doGet方法的使用:
範例:
功能:利用doGet方法去連線指定網路,並傳輸資料,伺服器接收資料後,在其控制檯列印。
思路:連線網路不能在主執行緒中進行,所以必須使用非同步通訊,這裡我們使用AsyncTask的方式。
缺陷:由於每次點選按鈕,都會開啟一個執行緒去連線網路,這並不是我們想要的結果,所以下節部落格,我們將會介紹一下谷歌提供的一些網路通訊框架^^。
1)執行緒中連線伺服器:
class MyAsyncTask extends AsyncTask<String, Integer, String>{//線上程中去連線網路
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.d("message", result);
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
// HttpClientBuilder builder = HttpClientBuilder.create();
// builder.setConnectionTimeToLive(3000, TimeUnit.MICROSECONDS);//?
//2.生成client
HttpClient client = new DefaultHttpClient();//可以直接用DefaultHttpClient來建立client
//3.設定為get方法
String url = "http://192.168.0.74:8080/myServer/Myserverlet?name=zhangsan";
HttpGet get = new HttpGet(url);
Log.d("message", url);
//4.設定伺服器接收後資料的讀取方式為utf-8
get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
try {
//5.執行get方法得到伺服器的返回的所有的資料,都存到response中。
HttpResponse response = client.execute(get);
//6.httpclient 訪問伺服器返回的表頭,包含http狀態碼
StatusLine statusLine = response.getStatusLine();
//7.得到狀態碼
int code = statusLine.getStatusCode();
if(code==HttpURLConnection.HTTP_OK){//如果連線成功
//8.獲得資料實體
HttpEntity entity = response.getEntity();
//9.獲得輸入流
InputStream is = entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
while(line != null){
System.out.println(line);
line=br.readLine();
}
}
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return "連線成功!";
}
}
解析:
這裡使用DefaultHttpClient建立client例項
HttpClient client = new DefaultHttpClient();
或者使用:
HttpClientBuilder builder = HttpClientBuilder.create().build();
2)開啟執行緒。
MyAsyncTask mytask = new MyAsyncTask ();
mytask.excute();