URLConnection傳送GET和POST請求
阿新 • • 發佈:2019-09-08
在java.net基礎包中內建了URLConnection類,它封裝了網路通訊的底層實現。
URLConnection類提供了很多的方法讓我們能夠方便的實現應用層的網路通訊。
基本步驟:
- 建立 URL 以及 URLConnection物件
- 設定 URLConnection物件的連線引數
- 連線到伺服器
- 使用輸出流向伺服器寫資料
- 使用輸入流從伺服器讀取資料
以下是使用URLConnection進行GET和POST請求的基礎示例程式:
package com.lanshiqin.utils.net; import java.io.*; import java.net.URL; import java.net.URLConnection; /** * * @author xieh 2019/9/8 網路請求工具類 * */ public class NetUtil { /** * 使用GET方法讀取http中的資料 * * @param urlAddress * url地址 * @return 請求的響應資料 */ public static String doGET(String urlAddress) { try { // 建立URL物件 URL url = new URL(urlAddress); // 開啟連線 獲取連線物件 URLConnection connection = url.openConnection(); // 從連線物件中獲取網路連線中的輸入位元組流物件 InputStream inputStream = connection.getInputStream(); // 將輸入位元組流包裝成輸入字元流物件,並進行字元編碼 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); // 建立一個輸入緩衝區物件,將字元流物件傳入 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 定義一個字串變數,用來接收輸入緩衝區中的每一行字串資料 String line; // 建立一個可變字串物件,用來裝載緩衝區物件的資料,使用字串追加的方式,將響應的所有資料都儲存在該物件中 StringBuilder stringBuilder = new StringBuilder(); // 使用迴圈逐行讀取輸入緩衝區的資料,每次迴圈讀入一行字串資料賦值給line字串變數,直到讀取的行為空時標識內容讀取結束迴圈 while ((line = bufferedReader.readLine()) != null) { // 將從輸入緩衝區讀取到的資料追加到可變字元物件中 stringBuilder.append(line); } // 依次關閉開啟的輸入流 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); // 將可變字串轉換成String物件返回 return stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 使用POST方法讀取HTTP中的資料 * * @param urlAddress * url地址 * @param params * 引數 * @return 請求的響應資料 */ public static String doPOST(String urlAddress, String params) { try { // 建立URL物件 URL url = new URL(urlAddress); // 開啟連線 獲取連線物件 URLConnection connection = url.openConnection(); // 設定請求編碼 connection.addRequestProperty("encoding", "UTF-8"); // 設定允許輸入 connection.setDoInput(true); // 設定允許輸出 connection.setDoOutput(true); // 從連線物件中獲取輸出位元組流物件 OutputStream outputStream = connection.getOutputStream(); // 將輸出的位元組流物件包裝成字元流寫出物件 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); // 建立一個輸出緩衝區物件,將要輸出的字元流寫出物件傳入 BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); // 向輸出緩衝區中寫入請求引數 bufferedWriter.write(params); // 重新整理輸出緩衝區 bufferedWriter.flush(); // 從連線物件中獲取輸入位元組流物件 InputStream inputStream = connection.getInputStream(); // 將輸入位元組流物件包裝成輸入字元流物件,並將字元編碼為UTF-8格式 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); // 建立一個輸入緩衝區物件,將要輸入的字元流物件傳入 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 建立一個字串物件,用來接收每次從輸入緩衝區中讀入的字串 String line; // 建立一個可變字串物件,用來裝載緩衝區物件的最終資料,使用字串追加的方式,將響應的所有資料都儲存在該物件中 StringBuilder stringBuilder = new StringBuilder(); // 使用迴圈逐行讀取緩衝區的資料,每次迴圈讀入一行字串資料賦值給line字串變數,直到讀取的行為空時標識內容讀取結束迴圈 while ((line = bufferedReader.readLine()) != null) { // 將緩衝區讀取到的資料追加到可變字元物件中 stringBuilder.append(line); } // 依次關閉開啟的輸入流 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); // 依次關閉開啟的輸出流 bufferedWriter.close(); outputStreamWriter.close(); outputStream.close(); // 將可變字串轉換成String物件返回 return stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } }
以上示例程式是假設這個一個普通的網頁資源,所以將位元組流直接包裝成字元流進行操作了。如果要上次或者下載檔案,就需要將位元組流包裝成檔案流。
記憶要點:
對Java的IO流不熟悉,容易對輸入輸出流搞混了,可使用以下方法記:
所謂的輸入和輸出,都是針對我們計算機自身而言的,從外部到計算機就是輸入。
從計算機到外部就是輸出。網路資源在計算機外部,要獲取某個網頁資料到我們計算機顯示就要使用輸入流讀入,如果要提交某個資料到指定網站,就要使用輸出流寫出。
- 網路通訊採用用位元組流來傳輸,不管是傳送和接收,Java都提供了將位元組流包裝成字元流以及其他流的類,使開發人員可以很方便的操作資源。
注意事項:
1.POST請求方式記得要設定URLConnection物件的setDoOutput方法裡的值為true,這樣我們才可以往輸出流中寫出我們的引數資料。引數寫出完畢後要呼叫輸出緩衝區的flush方法重新整理輸出緩衝區,將緩衝區的資料輸出。
2.開啟的輸入輸出