java構造http請求的幾種方式(附源碼)

一、form表單構造http請求

form (表單) 是 HTML 中的一個常用標簽. 可以用於給服務器發送 GET 或者 POST 請求.

form 的重要參數:

  • action: 構造的 HTTP 請求的 URL 是什麼.
  • method: 構造的 HTTP 請求的 方法 是 GET 還是 POST (form 隻支持 GET 和 POST).

input 的重要參數:

  • type: 表示輸入框的類型. text 表示文本, password 表示密碼, submit 表示提交按鈕.
  • name: 表示構造出的 HTTP 請求的 query string 的 key. query string 的 value 就是輸入框的用戶輸入的內容.
  • value: input 標簽的值. 對於 type 為 submit 類型來說, value 就對應瞭按鈕上顯示的文本.
 <form method="get" action="/collect">
     <input type="text" name="today">
     <input type="text" name="result">
     <button>提交</button>
</form>
 <form method="post" action="/collect">
    <input type="text" name="today">
    <input type="text" name="result">
    <button>提交</button>
</form>

以下是/collect資源,支持get和post請求:

打開所在的頁面,輸入,並點擊提交(以post為例子):

打開開發者工具的網絡面板可以觀察到:

請求頭和響應頭為:

請求體為:

get方法同理,隻是請求體中的數據去到瞭請求頭中變成查詢字符串瞭。

二、ajax構造http請求

從前端角度, 除瞭瀏覽器地址欄能構造 GET 請求, form 表單能構造 GET 和 POST 之外, 還可以通過 ajax的方式來構造 HTTP 請求. 並且功能更強大.

ajax 全稱 Asynchronous Javascript And XML, 是 2005 年提出的一種 JavaScript 給服務器發送
HTTP 請求的方式.
特點是可以不需要 刷新頁面/頁面跳轉 就能進行數據傳輸.

在 JavaScript 中可以通過 ajax 的方式構造 HTTP 請求.

<!DOCTYPE html>
<html lang="zh-hans">
<head>
    <meta charset="UTF-8">
    <title>發送有請求體的 ajax 請求</title>
</head>
<body>
    <script src="/js/ajax-send-request-body.js"></script>
</body>
</html>

以下是js代碼:

// 1. 創建 XMLHttpRequest 對象
var xhr = new XMLHttpRequest()
// 2. 調用 open 方法設置要訪問的 url
xhr.open('post', '/collect')
// 3. 默認異步處理響應. 需要掛在處理響應的回調函數.
xhr.onload = function() {
    console.log(xhr)
    console.log(this)
    console.log(this.status)
   console.log(this.getResponseHeader('location')) // header 中的 name 不區分大小寫
   console.log(this.responseText)
}

// 區別在這裡, 調用 setRequestHeader 設置請求頭。設置類型是text類型, 也可以是application/x-www-form-urlencoded 類型
xhr.setRequestHeader('Content-Type', 'text/killingvibe')
// 4. 調用 send 方法發送 http 請求
xhr.send('我隨便寫,按照 content-type 的格式去寫就行')

地址欄輸入http://127.0.0.1:8080/ajax-send-request-body.html 後,打開網絡面板,我們可以看到三個請求包,

拓展:

發送 application/json 數據,隻需要將上述代碼下面改成如下:

// 調用 setRequestHeader 設置請求頭
httpRequest.setRequestHeader('Content-Type', 'application/json');
// 4. 調用 send 方法發送 http 請求
httpRequest.send(JSON.stringify({
name: 'zhangsan',
age: 18
}));

三、Java socket構造http請求

所謂的 “發送 HTTP 請求”, 本質上就是按照 HTTP 的格式往 TCP Socket 中寫入一個字符串.
所謂的 “接受 HTTP 響應”, 本質上就是從 TCP Socket 中讀取一個字符串, 再按照 HTTP 的格式來解析.
我們基於 Socket 的知識, 完全可以構造出一個簡單的 HTTP 客戶端程序, 用來發送各種類型的 HTTP 請求.

客戶端代碼:

public class MyHttpClient {
    public static void main(String[] args) throws Exception {
        // 隻能進行一次請求-響應的 HTTP 客戶端
        // 主機                  127.0.0.1
        // 端口(進程)           8080
        // 資源路徑              /hello.html
        try (Socket socket = new Socket("127.0.0.1", 8080)) {
            // 準備 HTTP 請求內容
            // 文本   String

            // 格式:請求行
            String requestLine = "GET /hello.html HTTP/1.0\r\n";
            // 請求頭:完全可以沒有,但必須一個空行結尾
            String requestHeader1 = "Name: killingvibe\r\n\r\n";  // 請求頭中共有 1對 key-value
            String requestHeader2 = "Name: killingvibe\r\nAge: 1999\r\n\r\n";    // 請求頭中共有 2對 key-value
            String requestHeader3 = "\r\n"; // 請求頭中共有 0 對 key-value
            // 請求體,GET 是沒有請求體

            // 最終的請求 —— 要發送給服務器的東西
            String request = requestLine + requestHeader3;

            // 發送服務器的過程
            byte[] requestBytes = request.getBytes("ISO-8859-1");   // 字符集編碼

            // 發送(數據會經由 TCP、IP、以太網發送給服務器)
            OutputStream os = socket.getOutputStream();
            os.write(requestBytes);
            os.flush();

            // 請求既然已經發送,我們要做的就是等待響應
            InputStream is = socket.getInputStream();
            Scanner scanner = new Scanner(is, "UTF-8"); // 響應的前面字符集應該是 ISO-8859-1,後邊是 UTF-8
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
        }
    }
}

服務端代碼:

public class MyHttpServer {
    public static void main(String[] args) throws Exception {
        // 我們也監聽在 8080 端口上
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();  // 三次握手完成

                // 讀取用戶的請求 :咱這裡就不管用戶的請求是啥瞭,一律采用相同的方式返回響應

                // 發送響應
                // Content-Type: 瀏覽器應該按照什麼格式來看到我們響應的資源內容的(資源內容放在響應體中)
                // 響應體(資源的內容)
                String responseBody = "<h1>Welcome MyHttpServer</h1>";
                byte[] responseBodyBytes = responseBody.getBytes("UTF-8");
                int contentLength = responseBodyBytes.length;

                System.out.println("發送響應");
                String response = "HTTP/1.0 200 OK\r\n"
                        + "Server: killingvibeServer\r\n"
                        + "Content-Type: text/plain; charset=utf-8\r\n"       // 響應體的類型
                        + "Content-Length: " + contentLength + "\r\n"        // 響應體的長度
                        + "\r\n";

                byte[] responseBytes = response.getBytes("ISO-8859-1");
                OutputStream os = socket.getOutputStream();
                // TCP 是面向字節流的一種協議,所以隻要按順序發即可,不要管分幾次發送
                os.write(responseBytes);    // 先發送前面部分(響應行 和 響應頭)
                os.write(responseBodyBytes);    // 再發送響應體
                os.flush();

                // 發送完成之後,直接關閉 TCP 連接(短連接的處理模式)
                socket.close();
            }
        }
    }
}

控制臺打印如下:

總結

到此這篇關於java構造http請求的幾種方式(附源碼)的文章就介紹到這瞭,更多相關java構造http請求內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: