HttpUrlConnection&HttpClient用法介紹

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

前言

  1. 本節我們不使用 WebView,因為它幫我們封裝好了從伺服器請求資料的過程、以及對伺服器返回的資料進行解析的過程,僅 loadUrl() 一行程式碼就完美的將頁面展示出來了

  2. Android 中一般有兩種方式傳送 HTTP 請求:HttpURLConnection、HttpClient(2.3後淘汰). 我們體驗手動向伺服器傳送請求以及從伺服器獲得流資料的過程

  3. 本節完成上述 2. 的內容:從伺服器請求資料. 關於資料的解析,將在下節介紹

  4. 注意:網路請求(耗時操作)應在子執行緒中處理,否則丟擲 NetworkOnMainThreadException 異常

HttpURLConnection 的使用方法簡介

  • PART_A 從伺服器獲取資料

    • 建立URL物件,傳入地址

    • 開啟連結,獲取 HttpURLConnection 物件

    • 設定請求方式:GET 一般表示從伺服器獲取資料 | POST 一般表示向伺服器提交資料

    • 設定連線超時

    • 設定讀取超時,此時連線已成功

    • 獲取伺服器返回的流資料

      ```java /* * GET 請求獲取網路資料 / private static final int TIMEOUT_IN_MILLIONS = 5000;

      public static String doGet(final String url) {

      HttpURLConnection conn = null;
      InputStream is = null;
      
      try {
          conn = (HttpURLConnection) new URL(url).openConnection();
          conn.setRequestMethod("GET");
          conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
          conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
          if (conn.getResponseCode() == 200) {
              // 獲取網路返回的輸入流
              is = conn.getInputStream();
              // 輸入流轉字串
              return stream2String(is);
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              if (is != null) {
                  is.close();
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          conn.disconnect();
      }
      return null;
      

      }

      /* * 輸入流轉字串 / public static String stream2String(InputStream is) { ByteArrayOutputStream baos = null; try { // 位元組陣列輸出流 baos = new ByteArrayOutputStream();

          int len = 0;
          byte[] buffer = new byte[1024];
          while ((len = is.read(buffer)) != -1) {
              baos.write(buffer, 0, len);
          }
          return baos.toString();
      
      } catch (IOException e) {
          e.printStackTrace();
          return null;
      } finally {
          try {
              if (baos != null) {
                  baos.close();
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          try {
              if (is != null) {
                  is.close();
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      

      }

      /* * 字串轉輸入流 / public static InputStream string2Stream(String str) { return new ByteArrayInputStream(str.getBytes()); } ```

    • 呼叫

      java /** * 子執行緒中處理網路請求 */ new Thread(new Runnable() { @Override public void run() { String result = HttpUtils.doGet("http://10.0.2.2:8080/json.json"); } }).start();

    • 下一篇介紹如何解析伺服器傳來的資料(主要格式:xml、json)

  • PART_B 向伺服器提交資料

    • 僅需修改請求方法為 POST 請求,並傳入提交引數即可

      ```java conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true);

      DataOutputStream out = new DataOutputStream(conn.getOutputStream()); out.writeBytes("username=catface&password=123"); ```

HttpClient的使用方法簡介

  1. HttpClient是Apache提供的訪問網路的介面. 並對資料做了一定的封裝

  2. 與HttpURLConnection的作用和效果差不多,只是使用方式上稍有區別

  3. PART_A 從伺服器獲取資料

    • 建立HttpClient物件,注意是 new DefaultHttpClient()

    • 建立HttpGet物件,並將傳入地址

    • 執行GET請求,獲取伺服器返回的資訊

    • 判斷僅當請求成功時,獲取資料實體並使用U8編碼轉換成字串

      ```java new Thread(new Runnable() { @Override public void run() { try {

              // HttpClient請求網路的初始化操作
              HttpClient client = new DefaultHttpClient();
              HttpGet httpGet = new HttpGet("http://jianshu.com");
              HttpResponse response = client.execute(httpGet);
      
              if (response.getStatusLine().getStatusCode() == 200) {
                  HttpEntity entity = response.getEntity(); 
                  // 伺服器返回的流資料含中文時指定U8編碼.否則亂碼
                  final String result = EntityUtils.toString(entity, "UTF-8");
              }
          } catch (ClientProtocolException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      

      }).start(); ```

  4. PART_B 向伺服器提交資料

    java HttpPost httpPost = new HttpPost("http://jianshu.com"); // POST請求 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username", "catface")); // NameValuePair封裝提交引數 params.add(new BasicNameValuePair("password", "123")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8"); // 編碼 httpPost.setEntity(entity); httpClient.execute(httpPost);