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

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

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

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

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

form 的重要參數(shù):

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

input 的重要參數(shù):

  • type: 表示輸入框的類型. text 表示文本, password 表示密碼, submit 表示提交按鈕.
  • name: 表示構(gòu)造出的 HTTP 請(qǐng)求的 query string 的 key. query string 的 value 就是輸入框的用戶輸入的內(nèi)容.
  • value: input 標(biāo)簽的值. 對(duì)于 type 為 submit 類型來(lái)說(shuō), value 就對(duì)應(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請(qǐng)求:

打開(kāi)所在的頁(yè)面,輸入,并點(diǎn)擊提交(以post為例子):

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

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

請(qǐng)求體為:

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

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

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

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

在 JavaScript 中可以通過(guò) ajax 的方式構(gòu)造 HTTP 請(qǐng)求.

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

以下是js代碼:

// 1. 創(chuàng)建 XMLHttpRequest 對(duì)象
var xhr = new XMLHttpRequest()
// 2. 調(diào)用 open 方法設(shè)置要訪問(wèn)的 url
xhr.open('post', '/collect')
// 3. 默認(rèn)異步處理響應(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è)置請(qǐng)求頭。設(shè)置類型是text類型, 也可以是application/x-www-form-urlencoded 類型
xhr.setRequestHeader('Content-Type', 'text/killingvibe')
// 4. 調(diào)用 send 方法發(fā)送 http 請(qǐng)求
xhr.send('我隨便寫,按照 content-type 的格式去寫就行')

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

拓展:

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

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

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

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

客戶端代碼:

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

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

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

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

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

            // 請(qǐng)求既然已經(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)聽(tīng)在 8080 端口上
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();  // 三次握手完成

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

                // 發(fā)送響應(yīng)
                // Content-Type: 瀏覽器應(yīng)該按照什么格式來(lái)看到我們響應(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)體的長(zhǎ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();
            }
        }
    }
}

控制臺(tái)打印如下:

總結(jié)

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

相關(guān)文章

  • Java中的Semaphore源碼分析

    Java中的Semaphore源碼分析

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

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

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

    java時(shí)間段查詢將00:00:00更換成23:59:59

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

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

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

    Java中的setting和getting使用方法

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

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

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

    使用SpringBoot整合ssm項(xiàng)目的實(shí)例詳解

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

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

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

    Spring Cloud Ribbon負(fù)載均衡器處理方法

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

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

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

最新評(píng)論