一、前言
從今天開始,就要啟動后端的學習了,Springboot會貫穿到底,一定要跟著小編嚴謹的去搭建Springboot環境,依賴添加的過程可能需要2分鐘左右,讀者們要耐心等待一下,搭建好Springboot之后才算正式的開始web后端的學習,http相關的內容僅供了解。
如果大家準備好的話那就一起開啟我們的后端之旅。
二、springboot模塊創建
第一步:右鍵單擊->新建->模塊
第二步:Springboot->按照順序進行填寫->下一步
注:jdk和java版本號保持一致
第三步:選擇版本->勾選Spring Web->創建
三、http協議
3.1 HTTP 的特點和概述
無連接性:
- HTTP 協議是無連接的,即每次請求都是獨立的,服務器處理完一個請求后會斷開連接,下一個請求需要重新建立連接。這種特性使得每個請求都是獨立的,不會保留狀態信息,適合分布式的、基于請求-響應模型的網絡環境。
無狀態性:
- HTTP 協議是無狀態的,即服務器不會保存每個客戶端的請求信息。每次請求都是獨立的,服務器處理完后即忘記。這要求客戶端每次請求都要提供必要的信息,如 Cookie、Session ID 等,以維持狀態。
簡單和靈活:
- HTTP 協議簡單直觀,使用起來靈活。請求和響應都是文本形式,易于閱讀和調試。它支持各種數據格式,如文本、圖片、音頻、視頻等,使其成為廣泛應用于互聯網上的基礎協議。
基于請求-響應模型:
- HTTP 是基于請求-響應模型的協議。客戶端發送請求給服務器,請求中包含方法(如 GET、POST)、資源路徑、協議版本等信息;服務器根據請求進行處理,并返回響應,響應中包含狀態碼、響應頭和響應體等信息。
狀態碼和頭部信息:
- HTTP 使用狀態碼來表示請求的處理結果,如200表示成功,404表示未找到資源,500表示服務器內部錯誤等。同時,HTTP 使用頭部信息(Header)來傳遞額外的請求和響應信息,如內容類型、長度、Cookie等。
安全性和擴展性:
- HTTP 協議本身不具備加密功能,通信內容可以被竊聽和篡改,為了提高安全性,可以在 HTTP 上加入 SSL/TLS 協議形成 HTTPS。HTTP 協議也支持通過擴展頭部和方法來實現功能的擴展,如緩存控制、身份認證等。
3.2 請求協議
HTTP 請求協議是客戶端向服務器發送請求時所遵循的規范和格式。它定義了請求的結構、方法、請求頭部、請求體等內容。
請求行(Request Line):
請求行包含了請求的方法、資源路徑和協議版本,格式如下:
METHOD PATH VERSION
- METHOD:請求方法,例如 GET、POST、PUT、DELETE 等,用來指定請求的類型和操作方式。
- PATH:請求的資源路徑,即服務器上請求資源的位置。
- VERSION:HTTP 協議的版本號,通常是 HTTP/1.1 或 HTTP/2。
示例:
GET /index.html HTTP/1.1
請求頭部(Request Headers):
請求頭部包含了關于請求的各種信息,如客戶端信息、請求內容類型、認證信息等。每個頭部字段都以鍵值對形式出現,格式如下:
HeaderName: Value
常見的請求頭部包括:
- Host:請求的主機名,指示服務器請求的目標。
- User-Agent:發送請求的用戶代理(瀏覽器、爬蟲等)信息。
- Content-Type:請求體的類型(僅在有請求體時使用)。
- Authorization:認證信息,用于訪問受保護的資源。
示例:
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
請求體(Request Body):
某些請求(如 POST、PUT)可能會包含數據或內容,這些數據在請求體中傳輸。請求體的格式和內容根據請求的方法和需要而有所不同,通常是文本、JSON 數據或二進制數據。
示例:
POST /submit-form HTTP/1.1
Host: www.example.com
Content-Type: application/json{"username": "user123","password": "pass123"
}
HTTP 請求的基本流程:
- 建立連接:客戶端與服務器建立 TCP 連接。
- 發送請求:客戶端向服務器發送格式正確的 HTTP 請求。
- 服務器處理:服務器接收、解析并處理請求。
- 發送響應:服務器生成并發送 HTTP 響應給客戶端。
3.3 響應協議
HTTP 響應協議是服務器響應客戶端請求時遵循的規范和格式,它定義了響應的結構、狀態碼、響應頭部、響應體等內容。
狀態行(Status Line):
狀態行包含了響應的協議版本、狀態碼和狀態消息,格式如下:
VERSION STATUS_CODE REASON_PHRASE
- VERSION:HTTP 協議的版本號,通常是 HTTP/1.1 或 HTTP/2。
- STATUS_CODE:三位數字的狀態碼,表示服務器對請求的處理結果。
- REASON_PHRASE:對狀態碼的簡短描述,方便人類閱讀,但實際上并不影響機器處理。
HTTP/1.1 200 OK
響應頭部(Response Headers):
響應頭部包含了關于響應的各種信息,如服務器類型、響應內容類型、日期等。每個頭部字段同樣以鍵值對形式出現,格式如下:
HeaderName: Value
常見的響應頭部包括:
- Content-Type:響應體的類型。
- Content-Length:響應體的長度。
- Date:響應的日期和時間。
- Server:服務器的軟件信息。
- Set-Cookie:設置客戶端的 Cookie 信息。
示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Date: Sat, 10 Jul 2024 12:00:00 GMT
Server: Apache/2.4.38 (Ubuntu)
響應體(Response Body):
響應體包含了服務器返回給客戶端的實際內容,格式和內容根據響應的內容類型而有所不同,可以是文本、HTML、JSON 數據或二進制數據等。
示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234<!DOCTYPE html>
<html>
<head><title>Welcome to Example.com</title>
</head>
<body><h1>Hello, World!</h1><p>This is a sample HTML response.</p>
</body>
</html>
HTTP 響應的基本流程:
- 接收請求:服務器接收客戶端的 HTTP 請求。
- 處理請求:服務器處理請求,生成需要的數據和響應。
- 發送響應:服務器將響應的狀態行、頭部和體發送給客戶端。
3.4 協議解析
?1. 請求方法(Request Methods)
HTTP 定義了幾種請求方法,常見的包括:
- GET:請求指定的資源。
- POST:向指定資源提交數據進行處理請求(如提交表單或上傳文件)。
- PUT:上傳指定的資源。
- DELETE:刪除指定的資源。
- HEAD:獲取報頭信息,類似于 GET 請求,但服務器只返回報頭,不返回實體的主體部分。
- OPTIONS:列出可對資源實行的請求方法,用來查詢服務器支持的方法。
2. 狀態碼(Status Codes)
HTTP 使用狀態碼來表示服務器對請求的處理結果,常見的狀態碼包括:
- 2xx:成功。例如,200 表示請求成功。
- 3xx:重定向。例如,301 表示永久重定向,302 表示臨時重定向。
- 4xx:客戶端錯誤。例如,404 表示未找到請求的資源。
- 5xx:服務器錯誤。例如,500 表示服務器內部錯誤。
3. 報文結構
HTTP 報文分為請求報文和響應報文:
- 請求報文包括請求行、請求頭部和請求體。
- 響應報文包括狀態行、響應頭部和響應體。
4. 連接管理
HTTP/1.1 引入了持久連接(persistent connection)的概念,使得在同一個 TCP 連接上可以發送和接收多個 HTTP 請求和響應,減少了連接建立和關閉的開銷,提高了性能。
URL(Uniform Resource Locator)
URL 是統一資源定位符,用來唯一標識互聯網上的資源。HTTP 使用 URL 來指定請求的資源地址,包括協議類型(http:// 或 https://)、主機名、路徑、查詢參數等信息。
5. 安全性
HTTP 并不具備加密功能,因此傳輸的數據在傳輸過程中可能會被竊聽或篡改。為了解決這個問題,HTTPS(HTTP Secure)應運而生,通過 SSL/TLS 加密協議來保證通信安全。
6. 版本演變
- HTTP/0.9:最早的版本,只支持 GET 方法,沒有頭部信息,響應只包含 HTML 文檔。
- HTTP/1.0:引入了多種請求方法、狀態碼、頭部字段等。
- HTTP/1.1:支持持久連接、流水線處理、Host 頭部字段等,廣泛應用于現代 Web。
- HTTP/2:引入了新的二進制格式,多路復用、頭部壓縮等,提升了性能。
- HTTP/3:基于 UDP 實現,提供更快的傳輸速度和更好的性能。