1. 程式人生 > >URLConnection傳送GET和POST請求

URLConnection傳送GET和POST請求

在java.net基礎包中內建了URLConnection類,它封裝了網路通訊的底層實現。
URLConnection類提供了很多的方法讓我們能夠方便的實現應用層的網路通訊。

基本步驟:

  1. 建立 URL 以及 URLConnection物件
  2. 設定 URLConnection物件的連線引數
  3. 連線到伺服器
  4. 使用輸出流向伺服器寫資料
  5. 使用輸入流從伺服器讀取資料

以下是使用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流不熟悉,容易對輸入輸出流搞混了,可使用以下方法記:
所謂的輸入和輸出,都是針對我們計算機自身而言的,從外部到計算機就是輸入。
從計算機到外部就是輸出。網路資源在計算機外部,要獲取某個網頁資料到我們計算機顯示就要使用輸入流讀入,如果要提交某個資料到指定網站,就要使用輸出流寫出。

  1. 網路通訊採用用位元組流來傳輸,不管是傳送和接收,Java都提供了將位元組流包裝成字元流以及其他流的類,使開發人員可以很方便的操作資源。

注意事項:
1.POST請求方式記得要設定URLConnection物件的setDoOutput方法裡的值為true,這樣我們才可以往輸出流中寫出我們的引數資料。引數寫出完畢後要呼叫輸出緩衝區的flush方法重新整理輸出緩衝區,將緩衝區的資料輸出。
2.開啟的輸入輸出