JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議

1.1 基本概念:

?HTTP全稱超文本傳輸協議,是一種無狀態的、應用層的協議,它基于請求/響應模型。客戶端(通常是Web瀏覽器)通過發送HTTP請求到服務器來獲取或發送信息,服務器則返回HTTP響應作為回應。HTTP協議定義了客戶端和服務器之間交換消息的格式和過程,使得數據能夠在網絡上以統一的方式傳輸。

1.2 HTTP工作原理

?HTTP工作在TCP/IP協議棧的應用層,通常使用80端口進行通信。一個完整的HTTP交互流程包括以下幾個步驟:

  1. 建立TCP 連接:客戶端與服務器建立一個TCP連接,這是數據傳輸的前提;
  2. 發送HTTP請求:客戶端向服務器發送一個HTTP請求,(如GET /index.html)、請求頭部和請求體;
  3. 服務器處理請求:服務器解析器跪求并定位請求資源,如果需要i的話,服務器會執行相應的業務邏輯;
  4. 返回HTTP相應:服務器將響應數據封裝成HTTP響應,包括響應狀態行(如200 OK)、響應頭部和響應體,然后發送回客戶端。
  5. 關閉 TCP 連接:通信結束后,TCP連接可以被關閉,或者在持續連接(Keep-Alive)的情況下保持打開狀態以供后續請求復用。

二、 數據報文結構

在這里插入圖片描述
?HTTP 是一個文本格式的協議. 可以通過 Chrome 開發者工具或者 Fiddler 抓包, 分析 HTTP 請求/響應的細節.

2.1 HTTP 請求格式

在這里插入圖片描述

POST https://beacons.gvt2.com/domainreliability/upload HTTP/1.1
Host: beacons.gvt2.com
Connection: keep-alive
Content-Length: 638
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9{"entries":[{"failure_data":{"custom_error":"net::ERR_CONNECTION_TIMED_OUT"},"network_changed":false,"protocol":"","request_age_ms":136344,"request_elapsed_ms":21374,"sample_rate":1.0,"server_ip":"[2404:6800:4008:c04::54]:443","status":"tcp.connection.timed_out","url":"https://accounts.google.com/","was_proxied":false},{"failure_data":{"custom_error":"net::ERR_CONNECTION_TIMED_OUT"},"network_changed":false,"protocol":"","request_age_ms":136344,"request_elapsed_ms":21374,"sample_rate":1.0,"server_ip":"59.24.3.174:443","status":"tcp.connection.timed_out","url":"https://accounts.google.com/","was_proxied":false}],"reporter":"chrome"}

2.2 HTTP 響應格式

在這里插入圖片描述

HTTP/1.1 200 OK
Report-To: {"endpoints":[{"priority":1,"url":"https://beacons.gcp.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons2.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons3.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons4.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://clients2.google.com/domainreliability/upload-nel","weight":1},{"priority":2,"url":"https://beacons5.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":2,"url":"https://beacons5.gvt3.com/domainreliability/upload-nel","weight":1}],"group":"nel","max_age":300}
NEL: {"failure_fraction":1,"include_subdomains":false,"max_age":300,"report_to":"nel","success_fraction":0.25}
Content-Type: application/javascript; charset=utf-8
Date: Wed, 26 Jun 2024 02:45:34 GMT
Server: Domain Reliability Server
Content-Length: 0
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

為什么 HTTP 報文中要存在 “空行”?

?因為 HTTP 協議并沒有規定報頭部分的鍵值對有多少個。空行就相當于是 “報頭的結束標記”,或者是 “報頭和正文之間的分隔符”。TTP 在傳輸層依賴 TCP 協議, TCP 是面向字節流的。 如果沒有這個空行, 就會出現 "粘包問題。

HTTP之 URI 和URL

URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址, 以下面的這個URL 為例;

http://user:pass@www.example.jp:80/dir/index.htm?boardID=5&ID=24618&page=1#name

一個完整的 URL 主要包括一下幾個部分

  1. 協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符;

  2. 域名部分:該URL的域名部分為“user:pass@www.example.jp”。一個URL中,也可以使用IP地址作為域名使用;

  3. 端口部分:跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口;

  4. 擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”;

  5. 文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名;

  6. 錨部分:從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分

  7. 參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。

URI,全稱是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。
?Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來定位的URI一般由三部組成:

  1. 訪問資源的命名機制
  2. 存放資源的主機名
  3. 資源自身的名稱,由路徑表示,著重強調于資源。

三、HTTP方法

HTTP定義了多種請求方法,常用的有:

  • GET: 用于請求指定資源。
  • POST: 用于提交數據到指定資源。
  • PUT: 用于更新指定資源。
  • DELETE: 用于刪除指定資源。
  • HEAD: 類似于GET,但只返回響應頭(獲取報文首部)。
  • OPTIONS: 用于描述目標資源的通信選項(詢問支持的方法)。
  • CONNECT: 用于建立網絡隧道。
  • Link:建立和資源之間的聯系.
  • TRACE: 用于回顯服務器收到的請求(追蹤路徑)。

3.1 GET方法

?GET 是最常用的 HTTP 方法. 常用于獲取服務器上的某個資源。在瀏覽器中直接輸入 URL, 此時瀏覽器就會發送出一個 GET 請求.另外, HTML 中的 link, img, script 等標簽, 也會觸發 GET 請求。
GET 請求的特點

  • 首行的第一部分為 GET
  • URL 的 query string 可以為空, 也可以不為空.
  • header 部分有若干個鍵值對結構.
  • body 部分為空。

關于 GET 請求的 URL 長度問題:

  1. HTTP 協議由 RFC 2616 標準定義, 標準原文中明確說明: “Hypertext Transfer Protocol --HTTP/1.1,” does not specify any requirement for URL length.沒有對 URL 的長度有任何的限制.
  2. 實際 URL 的長度取決于瀏覽器的實現和 HTTP 服務器端的實現. 在瀏覽器端, 不同的瀏覽器最大長度是不同的, 但是現代瀏覽器支持的長度一般都很長; 在服務器端, 一般這個長度是可以配置的.

3.2 POST方法

? POST 方法也是一種常見的方法. 多用于提交用戶輸入的數據給服務器(例如登陸頁面)。通過 HTML 中的 form 標簽可以構造 POST 請求, 或者使用 JavaScript 的 ajax 也可以構造 POST 請求。
POST 請求的特點

  • 首行的第一部分為 POST
  • URL 的 query string 一般為空 (也可以不為空)
  • header 部分有若干個鍵值對結構.
  • body 部分一般不為空. body 內的數據格式通過 header 中的 Content-Type 指定. body 的長度由header 中的 Content-Length 指定

經典面試題: 談談 GET 和 POST 的區別

  1. 語義不同: GET 一般用于獲取數據,POST 一般用于提交數據;
  2. GET 的 body 一般為空,需要傳遞的數據通過 query string 傳遞,POST 的 query string 一般為空,需要傳遞的數據通過 body 傳遞;
  3. GET 請求一般是冪等的,POST 請求一般是不冪等的。(如果多次請求得到的結果一樣, 就視為請求是冪等的).
  4. GET可以被緩存,POST不能被緩存.(這一點也是承接冪等性)

四、HTTP 狀態碼 (重點)

HTTP響應狀態碼分為五大類:
*** 1xx (信息性響應): 表示接收的請求正在處理。

  • 2xx (成功響應): 表示請求正常處理完畢。
  • 3xx (重定向消息): 表示需要進行附加操作以完成請求。
  • 4xx (客戶端錯誤): 表示客戶端請求出錯。
  • 5xx (服務器錯誤): 表示服務器處理請求出錯。**

總結

?以上就是今天要講的內容,本文介紹了HTTP協議的基礎知識,包括其無狀態、應用層協議的特性,基于請求/響應的工作模式,以及TCP連接、HTTP請求和響應的流程。HTTP方法如GET、POST、PUT等用于不同操作,狀態碼則表示請求結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35986.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35986.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言:shell,Python,需要解析器 編譯型語言:C語言,C,需要編譯器 shell腳本 操作系統的結構 shell(貝殼) 應用層 app,代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

🍅 視頻學習:文末有免費的配套視頻可觀看 🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 一、面試基礎題 簡述測試流程: 1、閱讀相關技術文檔(如產品PRD、UI設計…

1、線性回歸模型

1、主要解決問題類型 1.1 預測分析(Prediction) 線性回歸可以用來預測一個變量(通常稱為因變量或響應變量)的值,基于一個或多個輸入變量(自變量或預測變量)。例如,根據房屋的面積、位置等因素預測房價。 1.2 異常檢測(Outlier Detection) 線性回歸可以幫助識別數…

鴻蒙開發系統基礎能力:【@ohos.systemTime (設置系統時間)】

設置系統時間 本模塊用來設置、獲取當前系統時間,設置、獲取當前系統日期和設置、獲取當前系統時區。 說明: 本模塊首批接口從API version 7開始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。 導入模塊 import systemTime …

沙盒在數據防泄密領域意義

在信息化快速發展的今天,數據已成為企業最寶貴的資產之一。然而,數據泄密事件頻發,給企業的安全和發展帶來了巨大威脅。SDC沙盒防泄密系統,作為一種創新的數據防泄密解決方案,正逐漸在數據防泄密領域發揮著越來越重要的…

理解和使用JavaScript的閉包

閉包 在前端開發中,JavaScript是一種非常重要的編程語言。它的靈活性和強大功能使得開發者可以創建豐富的用戶體驗。然而,JavaScript中有些概念對于初學者來說可能比較難以理解,閉包就是其中之一。本文將深入探討JavaScript中的閉包&#xf…

安裝zabbix時報錯Could not resolve host: mirrors.huaweicloud.com;Unknown error解決辦法

目錄 1、問題原因 2、解決辦法 3、知識拓展 DNS的區別 DNS配置文件解析 域名解析過程 4、書籍推薦 當安裝Zabbix server,Web前端,agent時出現: [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安裝過程中會出…

Python3極簡教程(一小時學完)上

開始 Python 之旅 本教程基于 Python for you and me 教程翻譯制作,其中參考了 Python tutorial 和 _The Python Standard Library_,并對原教程的內容進行了改進與補充。 相關鏈接地址如下: _Python tutorial_:Python 入門指南…

數字孿生流域:定義、組成等

數字孿生流域:定義、組成等 1 數字孿生流域(Digital Twin Basin/Watershed)總則1.1 定義1.2 適用范圍1.3 建設目標1.4 建設原則 2 數字孿生流域框架與組成2.1 數字孿生流域框架2.2 數字孿生流域組成2.2.1 數字孿生平臺2.2.2 信息化基礎設施 3…

類的裝飾器

1 使用類定義裝飾器 class Person(object):def __init__(self):self._age 0propertydef age(self):return self._ageage.setterdef age(self,newValue):print(觸發了嗎)self._age newValuep Person() print(p.age) # 0 p.age 20 print(p.age) # 20 2 類屬性 class Pe…

JavaScript學習筆記(二)

12、數字 常規用法和java的用法相似,就不再做詳細的記錄, JavaScript 數字 以下只記錄特殊用法: 12.1 數字字符串運算 在所有數字運算中,JavaScript 會嘗試將字符串轉換為數字: var x "100"; var y "10"…

探索QCS6490目標檢測AI應用開發(一):Yolov8n模型轉換及量化

目標檢測(Object Detection)是計算機視覺領域的核心任務之一,它旨在識別圖像中的物體并確定其位置,在本期的文章中,我們用一個端到端的目標檢測AI應用為例子。介紹如何在QCS6490 Ubuntu系統上實現一個目標檢測應用開發…

第 5 章理解 ScrollView 并構建 Carousel UI

通過上一章的學習,我相信你現在應該明白如何使用堆棧構建復雜的 UI。當然,在你掌握 SwiftUI 之前,你還需要大量的練習。因此,在深入研究 ScrollView 以使視圖可滾動之前,讓我們先以一個挑戰開始本章。你的任務是創建一個類似于圖 1 所示的卡片視圖。 …

如何遷移R包

遷移R包涉及將一個或多個R包從一個系統轉移到另一個系統。以下是遷移R包的詳細步驟: 1. 確定要遷移的R包 首先,列出你在當前系統中安裝的所有R包,或僅列出你需要遷移的R包。你可以使用以下代碼列出所有安裝的R包: installed_pa…

swp添加池子addLiquidity失敗

案發現場 首次添加交易對、一直失敗、但是也沒提示具體的原因。到這一步就沒了、由下圖可知、也沒看到log、由此可見第一步就失敗了。 解決方案 一、添加 工廠KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

移植對話框MFC

VC版 MFC程序對話框資源移植 以下均拷貝自上面,僅用來記錄 (部分有刪除) 法1: Eg:將B工程調試好的對話框移植到A工程中 1.資源移植 1.1 在2017打開B工程,在工作區Resource標簽頁中選中Dialog文件夾下的資源文件,按…

注意!短視頻的致命誤區,云微客教你避開!

為什么你做短視頻就是干不過同行?因為你總想著拍劇情、段子這些娛樂視頻,還想著當網紅做IP人設,但是這些內容跟你的盈利沒有半毛錢關系,況且難度大、見效慢,還不是精準客戶。 以上這些就代表你走進了短視頻的誤區&…

C++初學者指南-2.輸入和輸出---流輸入和輸出

C初學者指南-2.輸入和輸出—流輸入和輸出 文章目錄 C初學者指南-2.輸入和輸出---流輸入和輸出1.定制輸入/輸出1.1 示例:點坐標輸入/輸出1.2 流操作符1.3(一部分)標準庫流類型 2. 工具2.1 用getline讀取行 2.2 用ignore進行跳轉2.3 格式化操作…

【論文閱讀】-- Temporal Summary Images:通過交互式注釋生成和放置實現敘事可視化的方法

Temporal Summary Images: An Approach to Narrative Visualization via Interactive Annotation Generation and Placement 摘要1 引言2 背景及相關工作2.1 敘事可視化和講故事2.2 顯示面向時間的數據2.3 小倍數和漫畫2.4 注釋可視化 3 設計要求和工作流程3.1 工作流程3.2 TSI…

基線核查--滲透

基線檢查 基線核查概念 it中定義: 基線為初始的標準,以后更改就要經過授權,形成下一基線。 軟件配置管理的基線:1功能基線,分配基線,產品基線 安全配置基線--基線核查 安全基線可以說是木桶理論&…