欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年02月09日 08:43:48   作者:Killing?Vibe  
本文主要介紹了java構造http請求的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、form表單構造http請求

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

form 的重要參數(shù):

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

input 的重要參數(shù):

  • type: 表示輸入框的類型. text 表示文本, password 表示密碼, submit 表示提交按鈕.
  • name: 表示構造出的 HTTP 請求的 query string 的 key. query string 的 value 就是輸入框的用戶輸入的內(nèi)容.
  • 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為例子):

打開開發(fā)者工具的網(wǎng)絡面板可以觀察到:

請求頭和響應頭為:

請求體為:

get方法同理,只是請求體中的數(shù)據(jù)去到了請求頭中變成查詢字符串了。

二、ajax構造http請求

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

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

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

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

以下是js代碼:

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

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

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

拓展:

發(fā)送 application/json 數(shù)據(jù),只需要將上述代碼下面改成如下:

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

三、Java socket構造http請求

所謂的 “發(fā)送 HTTP 請求”, 本質(zhì)上就是按照 HTTP 的格式往 TCP Socket 中寫入一個字符串.
所謂的 “接受 HTTP 響應”, 本質(zhì)上就是從 TCP Socket 中讀取一個字符串, 再按照 HTTP 的格式來解析.
我們基于 Socket 的知識, 完全可以構造出一個簡單的 HTTP 客戶端程序, 用來發(fā)送各種類型的 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 請求內(nèi)容
            // 文本   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 是沒有請求體

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

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

            // 發(fā)送(數(shù)據(jù)會經(jīng)由 TCP、IP、以太網(wǎng)發(fā)送給服務器)
            OutputStream os = socket.getOutputStream();
            os.write(requestBytes);
            os.flush();

            // 請求既然已經(jīng)發(fā)送,我們要做的就是等待響應
            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 {
        // 我們也監(jiān)聽在 8080 端口上
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();  // 三次握手完成

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

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

                System.out.println("發(fā)送響應");
                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 是面向字節(jié)流的一種協(xié)議,所以只要按順序發(fā)即可,不要管分幾次發(fā)送
                os.write(responseBytes);    // 先發(fā)送前面部分(響應行 和 響應頭)
                os.write(responseBodyBytes);    // 再發(fā)送響應體
                os.flush();

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

控制臺打印如下:

總結

到此這篇關于java構造http請求的幾種方式(附源碼)的文章就介紹到這了,更多相關java構造http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的Semaphore源碼分析

    Java中的Semaphore源碼分析

    這篇文章主要介紹了Java中的Semaphore源碼分析,Semaphore是一個訪問公共資源的線程數(shù)量如限流、停車等,它是一個基于AQS實現(xiàn)的共享鎖,主要是通過控制state變量來實現(xiàn),需要的朋友可以參考下
    2023-11-11
  • 解析Oracle數(shù)據(jù)庫中的對象集合schema

    解析Oracle數(shù)據(jù)庫中的對象集合schema

    這篇文章主要介紹了Oracle數(shù)據(jù)庫中的對象集合schema,是Oracle數(shù)據(jù)庫入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • java時間段查詢將00:00:00更換成23:59:59

    java時間段查詢將00:00:00更換成23:59:59

    本文主要介紹了java時間段查詢將00:00:00更換成23:59:59,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • spring事務隔離級別、傳播機制以及簡單配置方式

    spring事務隔離級別、傳播機制以及簡單配置方式

    這篇文章主要介紹了spring事務隔離級別、傳播機制以及簡單配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java中的setting和getting使用方法

    Java中的setting和getting使用方法

    為了保障數(shù)據(jù)的安全性,通常將數(shù)據(jù)成員定義為private(封裝或私有化),這樣外部代碼就無法直接訪問這些數(shù)據(jù),只能通過類提供的公共方法來進行訪問,這種方法主要包括setter和getter方法,以及構造方法,setter方法用于給私有屬性賦值
    2024-09-09
  • Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解

    Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解

    這篇文章主要介紹了Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 使用SpringBoot整合ssm項目的實例詳解

    使用SpringBoot整合ssm項目的實例詳解

    Spring Boot 現(xiàn)在已經(jīng)成為 Java 開發(fā)領域的一顆璀璨明珠,它本身是包容萬象的,可以跟各種技術集成。這篇文章主要介紹了使用SpringBoot整合ssm項目,需要的朋友可以參考下
    2018-11-11
  • Java執(zhí)行cmd命令的舉例與注意事項

    Java執(zhí)行cmd命令的舉例與注意事項

    Java應用程序主要是通過Runtime和Process兩個類來執(zhí)行cmd命令,下面這篇文章主要給大家介紹了關于Java執(zhí)行cmd命令的方法與注意事項,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Spring Cloud Ribbon負載均衡器處理方法

    Spring Cloud Ribbon負載均衡器處理方法

    這篇文章主要介紹了Spring Cloud Ribbon負載均衡器處理方法,看看是如何獲取服務實例,獲取以后做了哪些處理,處理后又是如何選取服務實例的,需要的朋友可以參考下
    2018-02-02
  • java接口中的代理設計模式代碼時實踐

    java接口中的代理設計模式代碼時實踐

    這篇文章主要介紹了java接口中的代理設計模式代碼時實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論