HTTP 協議概覽
- 全稱:HyperText Transfer Protocol (超文本傳輸協議)。
- 發明者:Tim Berners-Lee (Web 之父)。
- 本質:基於 TCP/IP 的 應用層協議,**明文文本傳輸**,默認端口 80 (HTTPS 為 443)。
- 核心特徵:
- 無狀態:伺服器不保留客戶端上下文,每次請求獨立。需靠 Cookie/Session/Token 維持狀態。
- 請求-響應模型:客戶端主動發起,伺服器被動響應。
- 靈活可擴展:Headers 機制支援元數據協商 (內容類型、編碼、緩存、認證)。
HTTP 报文結構
請求報文與響應報文結構對稱,均包含三部分:起始行、首部字段、實體主體 (可選)。
1. 請求報文
GET /search?q=java&page=1 HTTP/1.1 <-- 請求行
Host: www.example.com <-- 首部字段
User-Agent: Mozilla/5.0 (Windows NT 10.0...)
Accept: text/html,application/xhtml+xml
Accept-Language: zh-TW,zh;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: JSESSIONID=ABC123; theme=dark
<-- 空行 (CRLF) 分隔首部與主體
<-- GET 請求通常無主體
- 請求行:
方法 SP 請求目標 SP HTTP版本 CRLF。
- 請求目標 = 絕對路徑 + 查詢字符串 (如
/search?q=java)。
- 常用請求首部:
| 首部 | 作用 |
Host | 目標主機域名/IP:端口 (HTTP/1.1 必須),支援虛擬主機。 |
User-Agent | 客戶端身份標識 (瀏覽器/爬蟲/工具),用於兼容性判斷/統計。 |
Accept | 可接受的響應媒體類型 (MIME),如 text/html, application/json。 |
Accept-Encoding | 支援的壓縮算法 (gzip, deflate, br),伺服器可選擇壓縮響應體。 |
Accept-Language | 偏好語言,支援內容協商。 |
Cookie | 攜帶會話標識/追蹤數據。 |
Content-Type | 請求主體媒體類型 (POST/PUT 必須),如 application/x-www-form-urlencoded, multipart/form-data, application/json。 |
Content-Length | 請求主體字節長度。 |
Authorization | 認證憑證 (Bearer Token, Basic Auth)。 |
2. 響應報文
HTTP/1.1 200 OK <-- 狀態行
Date: Mon, 27 May 2024 10:00:00 GMT <-- 首部字段
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Content-Encoding: gzip
Set-Cookie: session_id=xyz; Path=/; HttpOnly; Secure
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
<html><body><h1>Hello World</h1></body></html> <-- 響應主體
- 狀態行:
HTTP版本 SP 狀態碼 SP 原因短語 CRLF。
- 狀態碼分類:
| 類別 | 含義 | 常見碼 |
| 1xx | 資訊響應 | 100 Continue |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 重定向 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 客戶端錯誤 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed |
| 5xx | 伺服器錯誤 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout |
- 常用響應首部:
Content-Type (體格式), Content-Length (體長度), Set-Cookie (種植 Cookie), Cache-Control (緩存策略), Location (重定向目標), ETag/Last-Modified (緩存驗證)。
核心方法語義與實戰差異
| 方法 | 語義 | 冪等性 | 安全性 | 主體 | 典型場景 |
| GET | 獲取資源 | 是 | 是 (只讀) | 無 (參數在 URL 查詢串) | 查詢列表、詳情、搜索、靜態資源 |
| POST | 提交實體/執行動作 | 否 | 否 (可能修改狀態) | 有 (表單、JSON、文件) | 新增數據、登錄認證、文件上傳、複雜查詢 |
| PUT | 整體替換/創建資源 | 是 | 否 | 有 | 完整更新用戶資料、上傳文件(指定路徑) |
| PATCH | 部分更新資源 | 否 | 否 | 有 | 修改用戶暱稱、狀態切換 |
| DELETE | 刪除資源 | 是 | 否 | 通常無 | 刪除文章、取消訂單 |
| HEAD | 獲取響應首部 (無主體) | 是 | 是 | 無 | 檢查資源是否存在/大小/修改時間 |
| OPTIONS | 查詢支援的方法/跨域預檢 | 是 | 是 | 無 | CORS Preflight、API 探測 |
GET vs POST 核心差異總結
- 參數位置:GET 在 URL 查詢字符串 (
?k=v);POST 在請求主體。
- 長度限制:GET 受限於瀏覽器/伺服器 URL 長度 (~2KB~8KB);POST 理論無上限 (受
Content-Length/伺服器配置限制)。
- 安全性:GET 參數暴露於 URL (歷史、日誌、Referer),**不可傳輸敏感信息** (密碼、Token);POST 主體相對隱蔽 (但明文傳輸仍需 HTTPS)。
- 冪等性:GET 冪等 (重試安全);POST 非冪等 (重試可能重複提交訂單) -> **防重機制** (Token、冪等鍵)。
- 緩存:GET 響應可被緩存 (304/ETag);POST 默認不緩存。
- 回退/刷新:GET 瀏覽器自動重試;POST 瀏覽器彈窗確認「重新提交表單」。
查詢字符串 與 URL 編碼
- 格式:
?key1=val1&key2=val2。? 起始,& 分隔,= 鍵值連接。
- 保留字符 (
? & = # % + 空格 等) 及非 ASCII 字符 **必須進行 Percent-Encoding (URL 編碼)**。
- 空格 ->
%20 (或 + 僅限 application/x-www-form-urlencoded 主體)。
- 中文「測試」 ->
%E6%B8%AC%E8%A9%A6 (UTF-8 編碼後每字節 %XX)。
- Java 處理:
URLEncoder.encode("值", "UTF-8") / URLDecoder.decode;Spring @RequestParam 自動解碼。
HTTP/1.1 關鍵性能優化特性
- 持久連接:默認
Connection: keep-alive,複用 TCP 連接傳輸多個請求/響應,減少握手開銷。
- 管線化:請求無需等待前一響應即可發送 (但響應須按序返回,易導致隊頭阻塞,實際少用)。
- 分塊傳輸編碼:
Transfer-Encoding: chunked,動態生成內容時無需預知 Content-Length,邊生成邊發送。
- 內容協商:基於
Accept, Accept-Language, Accept-Encoding 自動返回最佳表現形式。
- 緩存機制:強緩存 (
Cache-Control: max-age, Expires) + 協商緩存 (ETag/If-None-Match, Last-Modified/If-Modified-Since) -> 304 Not Modified 零主體傳輸。
從 HTTP/1.1 到 HTTP/2 與 HTTP/3
| 版本 | 核心突破 | 解決痛點 |
| HTTP/1.1 | 文本協議、持久連接、管線化 | 基礎通信、隊頭阻塞(管線化)、Header 重複大、明文不安全 |
| HTTP/2 (h2) | 二進制幀、多路復用、Header 壓縮 (HPACK)、服務器推送 | 單連接並行傳輸消除隊頭阻塞、Header 體積減 80%+、主動推送關鍵資源 |
| HTTP/3 (h3) | 基於 QUIC (UDP)、0-RTT 握手、連接遷移 (IP 變更不斷) | 傳輸層隊頭阻塞 (TCP 丟包阻塞所有流)、握手延遲、網絡切換斷連 |
總結
HTTP 協議是 Web 世界的通用語言。精通報文結構、方法語義、狀態碼、首部字段協商 (緩存、認證、內容協商、CORS)、版本演進優化點,是後端開發、API 設計、性能調優、安全防護、爬蟲開發、網絡故障排查的**核心基本功**。實戰中善用開發者工具 Network 面板、curl、Postman、Wireshark 抓包分析,將理論轉化為解決問題的直觀能力。
]]>