亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中HttpURLConnection與HttpClient的使用與封裝

2020-01-02 07:01:50
字體:
來源:轉載
供稿:網友

1.寫在前面

    大部分andriod應用需要與服務器進行數據交互,HTTP、FTP、SMTP或者是直接基于SOCKET編程都可以進行數據交互,但是HTTP必然是使用最廣泛的協議。
    本文并不針對HTTP協議的具體內容,僅探討android開發中使用HTTP協議訪問網絡的兩種方式――HttpURLConnection和HttpClient
    因為需要訪問網絡,需在AndroidManifest.xml中添加如下權限

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

2.HttpURLConnection

2.1 GET方式

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL; // 以下代碼實現了以GET方式發起HTTP請求// 連接網絡是耗時操作,一般新建線程進行 private void connectWithHttpURLConnection() {  new Thread( new Runnable() {    @Override    public void run() {      HttpURLConnection connection = null;      try {        // 調用URL對象的openConnection方法獲取HttpURLConnection的實例        URL url = new URL("http://www.49028c.com");        connection = (HttpURLConnection) url.openConnection();        // 設置請求方式,GET或POST        connection.setRequestMethod("GET");        // 設置連接超時、讀取超時的時間,單位為毫秒(ms)        connection.setConnectTimeout(8000);        connection.setReadTimeout(8000);        // getInputStream方法獲取服務器返回的輸入流        InputStream in = connection.getInputStream();        // 使用BufferedReader對象讀取返回的數據流        // 按行讀取,存儲在StringBuider對象response中        BufferedReader reader = new BufferedReader(new InputStreamReader(in));        StringBuilder response = new StringBuilder();        String line;        while ((line = reader.readLine()) != null) {          response.append(line);        }        //..........        // 此處省略處理數據的代碼        // 若需要更新UI,需將數據傳回主線程,具體可搜索android多線程編程      } catch (Exception e){        e.printStackTrace();      } finally {        if (connection != null){          // 結束后,關閉連接          connection.disconnect();        }      }    }  }).start();}

2.2 POST方式

import java.io.DataOutputStream; //將對應部分改為connection.setRequestMethod("POST");DataOutputStream data = new DataOutputStream(connection.getOutputStream());data.writeBytes("stu_no=12345&stu_name=Tom");

傳入多個參數用&隔開
如需傳入復雜的參數,可使用JSON,關于JSON的用法介紹,可以參考我的另一篇隨筆JSON解析的兩種方法。
3.HttpClient

3.1 GET方式

import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.HttpResponse;import org.apache.http.HttpEntity;import org.apache.http.HttpStatus; // 創建DefaultHttpClient實例HttpClient httpClient = new DefaultHttpClient();   //傳入網址,然后執行HttpGet httpGet = new HttpGet("http://www.49028c.com");HttpResponse httpResponse = httpClient.execute(httpGet); // 由狀態碼判斷請求結果,// 常見狀態碼 200 請求成功,404 頁面未找到// 關于HTTP的更多狀態碼直接GOOGLEif (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {      // 請求成功,使用HttpEntity獲得返回數據  // 使用EntityUtils將返回數據轉換為字符串  HttpEntity entity = httpResponse.getEntity();   String response = EntityUtils.toString(entity);  //如果是中文,指定編碼   //==>String response = EntityUtils.toString(entity, "utf-8"); }

3.2 POST方式

import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.message.BasicNameValuePair; HttpClient httpClient = new DefaultHttpClient();HttpPost httpPost("http://www.49028c.com"); // 使用NameValuePair(鍵值對)存放參數List<NameValuePair> data = new ArrayList<NameValuePair>();// 添加鍵值對data.add(new BasicNameValuePair("stu_no", 12345));data.add(new BasicNameValuePair("stu_name", "Tom"));// 使用setEntity方法傳入編碼后的參數httpPost.setEntity(new UrlEncodedFormEntity(data, "utf-8")); // 執行該POST請求HttpResponse httpResponse = httpClient.execute(httpPost);// .....省略處理httpResponse的代碼,與GET方式一致

3.3 android 6.0移除HttpClient

android 6.0(API 23)版本的SDK已將Apache HttpClient相關類移除,解決辦法自行GOOGLE,推薦使用HTTPURLConnection。
若還需使用該類,點擊查看解決辦法。
4.HttpURLConnection實戰
如果你使用過JQuery(一個javasript庫),你一定對JQuery的網路編程印象深刻,比如一個HTTP請求只需以下幾行代碼。

// JQuery的post方法$.post("http://www.49028c.com",{    "stu_no":12345,    "stu_name":"Tom",  }).done(function(){    //...請求成功的代碼  }).fail(function(){    //...請求失敗的代碼  }).always(function(){    //...總會執行的代碼  })

    我們當然不希望每次網絡請求都寫下2.1中那么繁瑣的代碼,那么android的HTTP請求能否像JQuery那么簡單呢?當然可以!下面的代碼實現了HttpURLConnection的HTTP請求方法封裝:

4.1 定義接口HttpCallbackListener,為了實現回調

// 定義HttpCallbackListener接口// 包含兩個方法,成功和失敗的回調函數定義public interface HttpCallbackListener {  void onFinish(String response);  void onError(Exception e);}

4.2 創建HttpTool類,抽象請求方法(GET)

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL; /* 創建一個新的類 HttpTool,將公共的操作抽象出來 * 為了避免調用sendRequest方法時需實例化,設置為靜態方法 * 傳入HttpCallbackListener對象為了方法回調 * 因為網絡請求比較耗時,一般在子線程中進行, * 為了獲得服務器返回的數據,需要使用java的回調機制 */ public class HttpTool {  public static void sendRequest(final String address,       final HttpCallbackListener listener) {    new Thread(new Runnable() {      @Override      public void run() {        HttpURLConnection connection = null;         try {          URL url = new URL(address);          connection = (HttpURLConnection) url.openConnection();          connection.setRequestMethod("GET");          connection.setConnectTimeout(8000);          connection.setReadTimeout(8000);          InputStream in = connection.getInputStream();          BufferedReader reader = new BufferedReader(new InputStreamReader(in));          StringBuilder response = new StringBuilder();   String line;          while ((line = reader.readLine()) != null) {            response.append(line);          }          if (listener != null) {            // 回調方法 onFinish()            listener.onFinish(response.toString());          }        } catch (Exception e) {          if (listener != null) {            // 回調方法 onError()            listener.onError(e);          }        } finally {          if (connection != null) {            connection.disconnect();          }        }      }    }).start();  }}

4.3 調用示例

//使用該HttpTool發起GET請求String url = "http://www.49028c.com";HttpTool.sendRequest(url,new HttpCallbackListener(){  @Override   public void onFinish(String response) {    // ...省略對返回結果的處理代碼   }      @Override   public void onError(Exception e) {      // ...省略請求失敗的處理代碼  } });

4.4 抽象請求方法(POST)

/* 在GET方法實現的基礎上增加一個參數params即可, * 將參數轉換為字符串后傳入 * 也可以傳入鍵值對集合,再處理 */public static void sendRequest(final String address,  final String params, final HttpCallbackListener listener){    //...}

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91久久婷婷一区二区| 欧美黑人xxxⅹ高潮交| 久久精品色欧美aⅴ一区二区| 国产精品视频xxxx| 日本精品一区二区三区在线播放视频| 国产精品视频免费观看www| 2021国产精品视频| 2025国产精品视频| 欧美一区三区三区高中清蜜桃| 国语自产精品视频在线看抢先版图片| 57pao精品| 亚洲欧洲日产国产网站| 国产在线精品成人一区二区三区| 富二代精品短视频| 精品中文字幕久久久久久| 久久影视电视剧免费网站| 欧美日韩精品中文字幕| 国产日本欧美一区二区三区| 欧美在线一区二区视频| 国产日韩欧美黄色| 国产日韩在线精品av| 国产精品a久久久久久| 亚洲综合日韩在线| 91久久精品美女| 午夜伦理精品一区| 亚洲精品免费一区二区三区| 成人有码在线视频| 国产精品吊钟奶在线| 欧美孕妇毛茸茸xxxx| 欧美高跟鞋交xxxxhd| 亚洲高清免费观看高清完整版| 欧美午夜精品久久久久久久| 777精品视频| 亚洲精品欧美极品| 久久久在线免费观看| 欧美黑人狂野猛交老妇| 91久久精品国产91久久| 国产成人精品a视频一区www| 国产精品福利在线观看| 久久精视频免费在线久久完整在线看| 日本久久久久亚洲中字幕| 91精品国产综合久久香蕉922| 亚洲人成人99网站| 精品亚洲va在线va天堂资源站| 国产精品日韩精品| 亚洲性视频网址| 亚洲区在线播放| 亚洲精品日韩av| 91久久综合亚洲鲁鲁五月天| 欧美影院在线播放| 亚洲自拍高清视频网站| 亚洲精品视频久久| 久久久久久久影视| 久热精品视频在线观看| 国模吧一区二区| 国产一区二区三区四区福利| 国产精品永久在线| 成人免费视频97| 91精品久久久久久久久久久久久| 日本一区二区三区四区视频| 欧美在线播放视频| 另类少妇人与禽zozz0性伦| 国产精品永久免费观看| 久久久久久亚洲| 亚洲国产成人在线视频| 日韩av中文字幕在线免费观看| 亚洲色图美腿丝袜| 一区二区三区天堂av| www.欧美免费| 日韩精品在线播放| 亚洲国产精品久久久久久| 日韩在线观看精品| 色妞一区二区三区| 国产精品久久久久久久电影| 国产欧美日韩丝袜精品一区| 国产精品久久久久久久久久免费| 欧美自拍视频在线观看| 国产日本欧美一区二区三区在线| 最新日韩中文字幕| 国产视频精品一区二区三区| 国产精品 欧美在线| 国产亚洲一区二区精品| 亚洲精品www| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲人成在线播放| www国产精品com| 国产啪精品视频网站| 伊人久久五月天| 欧美性猛交xxxx富婆弯腰| 欧美成人在线网站| 国产日韩av高清| 亚洲国产天堂久久国产91| 欧美高清一级大片| 日韩国产中文字幕| 久久中文字幕在线视频| 国产免费亚洲高清| 国模精品一区二区三区色天香| 一区二区三区 在线观看视| 中文字幕国产亚洲2019| 综合136福利视频在线| 成人免费网视频| 亚洲黄页视频免费观看| 成人午夜小视频| 国产日韩欧美中文在线播放| 国产精品第8页| 中文字幕v亚洲ⅴv天堂| 日韩中文字幕在线精品| 欧美日韩爱爱视频| www欧美xxxx| 91日本在线观看| 国产精品人人做人人爽| 久久精品男人天堂| 亚洲欧美日韩在线高清直播| 欧美另类老女人| 亚洲精品视频在线播放| 欧美一级电影免费在线观看| 在线成人一区二区| 成人乱人伦精品视频在线观看| 亚洲91av视频| 在线精品视频视频中文字幕| 久色乳综合思思在线视频| 亚洲精品xxxx| 日韩欧美在线视频免费观看| 亚洲一区二区三区777| 日韩av片电影专区| 米奇精品一区二区三区在线观看| 97在线精品国自产拍中文| 国产精品国产三级国产专播精品人| 日韩高清电影好看的电视剧电影| 欧美日韩aaaa| 人妖精品videosex性欧美| 日韩av在线导航| 欧美电影免费观看电视剧大全| 精品亚洲va在线va天堂资源站| 日韩av手机在线看| 久久精品国产v日韩v亚洲| 久久国产精品免费视频| 国产色婷婷国产综合在线理论片a| 久久青草精品视频免费观看| 国产精品国产自产拍高清av水多| 欧美性视频在线| 久久精品影视伊人网| 精品国产一区二区三区久久久| 欧美专区在线播放| 亚洲自拍偷拍一区| 国产精品高潮呻吟久久av黑人| 国产裸体写真av一区二区| 韩国精品久久久999| 亚洲视频欧洲视频| 亚洲黄色av女优在线观看| 欧美天天综合色影久久精品| 日韩av电影在线网| 国产精品一区二区在线| 国产成人精品视频| 在线看福利67194| 精品亚洲一区二区| 亚洲欧美日韩国产中文专区| 国产精品一二三在线| 亚洲精品一区二区三区不| 精品福利在线观看| 国内自拍欧美激情| 亚洲色图综合网| 少妇高潮久久77777| 亚洲丁香久久久|