1. 程式人生 > >網路連線之——HttpClient(doGet和doPost)

網路連線之——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();