亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、form表單構(gòu)造http請求

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

form 的重要參數(shù):

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

input 的重要參數(shù):

  • type: 表示輸入框的類型. text 表示文本, password 表示密碼, submit 表示提交按鈕.
  • name: 表示構(gòu)造出的 HTTP 請求的 query string 的 key. query string 的 value 就是輸入框的用戶輸入的內(nèi)容.
  • value: input 標簽的值. 對于 type 為 submit 類型來說, value 就對應(yīng)了按鈕上顯示的文本.
 <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)絡(luò)面板可以觀察到:

請求頭和響應(yīng)頭為:

請求體為:

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

二、ajax構(gòu)造http請求

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

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

在 JavaScript 中可以通過 ajax 的方式構(gòu)造 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 方法設(shè)置要訪問的 url
xhr.open('post', '/collect')
// 3. 默認異步處理響應(yīng). 需要掛在處理響應(yīng)的回調(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 設(shè)置請求頭。設(shè)置類型是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)絡(luò)面板,我們可以看到三個請求包,

拓展:

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

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

三、Java socket構(gòu)造http請求

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

客戶端代碼:

public class MyHttpClient {
    public static void main(String[] args) throws Exception {
        // 只能進行一次請求-響應(yīng)的 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";
            // 請求頭:完全可以沒有,但必須一個空行結(jié)尾
            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ā)送給服務(wù)器的東西
            String request = requestLine + requestHeader3;

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

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

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

服務(wù)端代碼:

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();  // 三次握手完成

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

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

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

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

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

控制臺打印如下:

總結(jié)

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

相關(guān)文章

  • 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ù)庫入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    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事務(wù)隔離級別、傳播機制以及簡單配置方式

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

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

    Java中的setting和getting使用方法

    為了保障數(shù)據(jù)的安全性,通常將數(shù)據(jù)成員定義為private(封裝或私有化),這樣外部代碼就無法直接訪問這些數(shù)據(jù),只能通過類提供的公共方法來進行訪問,這種方法主要包括setter和getter方法,以及構(gòu)造方法,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ā)領(lǐng)域的一顆璀璨明珠,它本身是包容萬象的,可以跟各種技術(shù)集成。這篇文章主要介紹了使用SpringBoot整合ssm項目,需要的朋友可以參考下
    2018-11-11
  • Java執(zhí)行cmd命令的舉例與注意事項

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

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

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

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

    java接口中的代理設(shè)計模式代碼時實踐

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

最新評論