報文是如何流動的
HTTP報文
是在HTTP程序之間發送的數據塊
。數據塊以一些文本形式的元信息
開頭。
報文方向有:流入
、流出
、上游
、下游
。
流入
和流出
描述事務處理的方向,流入和流出是基于服務器的描述。
流入:客戶端發往服務器的請求報文
流出:從服務器發出到客戶端的響應報文
發出方在上游,接收方在下游
:所有的報文都會向下游流動,所有報文的發送者都在接收者的上游。
HTTP報文的三個組成部分
對報文進行描述的起始行
、包含屬性的首部
塊、可選的包含數據的主體
。
起始行和首部是由行分隔的ASCII文本,每行以一個行終止序列
(兩個字符組成)作為結束,其中包括一個回車符
(ASCII碼13)和一個換行符
(ASCII碼10),寫做CRLF
。
Content-type
表示主體是什么類型的數據,Content-length
表示主體有多大(多少個字節)。
報文語法
- 方法(method):客戶端希望服務器對資源執行的動作,如:GET、POST
- 請求URL(request-URL):路徑組件的完整URL(除協議和主機名端口號之外的部分)
- 版本(version):報文所使用的HTTP版本,格式
HTTP/<major>.<minor>
,其中major主要版本號,minor次要版本號,比如:HTTP/1.1
- 狀態碼(status-code):三位數字,描述請求過程中發生的情況,第一位數字用于描述一般類別(成功、出錯)等。
- 原因短語(reason-phrase):數字狀態碼的可讀版本
- 首部(header):零個或多個,
名字
+:
+可選空格
+值
+CRLF
,如:Content-Type: application/json
注意:一組HTTP首部總是應該以一個空行結束(僅有CRLF),即使沒有首部和主體。
示例:
起始行:請求報文的起始行,包含一個方法
+ 一個請求URL
+ HTTP版本
響應行:響應報文的起始行,包含HTTP版本
+ 數字狀態碼
+ 原因短語
常用 HTTP 狀態碼匯總
MDN文檔
狀態碼 | 原因短語 (Reason Phrase) | 含義 | 備注 |
---|---|---|---|
100 | Continue | 服務器已收到請求頭,客戶端應繼續發送請求體。 | 常用于 Expect: 100-continue 頭部的大文件上傳場景,確認服務器是否愿意接收數據。 |
101 | Switching Protocols | 服務器應客戶端要求,正在切換協議(如從 HTTP 切換到 WebSocket)。 | 客戶端通過 Upgrade 頭部請求協議切換。 |
200 | OK | 請求成功。 響應內容取決于請求方法(GET 返回資源,PUT/POST 可能返回操作結果)。 | 最常用的成功狀態碼。 |
201 | Created | 請求成功,并在服務器上創建了新的資源。 | 通常在 POST 或 PUT 請求后返回,響應頭 Location 通常包含新資源的 URL。 |
202 | Accepted | 請求已被接受處理,但處理尚未完成。 | 適用于異步操作,最終結果可能稍后通過其他方式通知。 |
204 | No Content | 服務器成功處理了請求,但響應中沒有返回任何內容。 | 常用于 DELETE 請求成功或 PUT 更新成功但無需返回數據時。 |
206 | Partial Content | 服務器成功處理了部分 GET 請求(范圍請求)。 | 響應頭 Content-Range 指示返回的是哪部分內容。用于大文件下載、斷點續傳。 |
301 | Moved Permanently | 請求的資源已被永久移動到新的 URL。 | 瀏覽器/搜索引擎會更新書簽和索引。 響應頭 Location 提供新 URL。 |
302 | Found | 請求的資源臨時從不同的 URL 響應。 | 瀏覽器會重定向,但不會更新書簽/索引。 (原始語義是“臨時移動”,但實際常被用作臨時重定向)。 |
304 | Not Modified | 資源未被修改,客戶端可以使用緩存的版本。 | 用于條件請求(請求頭如 If-Modified-Since , If-None-Match ),表示資源未改變,節省帶寬。 |
307 | Temporary Redirect | 請求的資源臨時從不同的 URL 響應。 | 與 302 類似,但嚴格要求重定向時使用相同的 HTTP 方法(如 POST 重定向后仍用 POST)。 |
308 | Permanent Redirect | 請求的資源已被永久移動到新的 URL。 | 與 301 類似,但嚴格要求重定向時使用相同的 HTTP 方法(如 POST 重定向后仍用 POST)。 |
400 | Bad Request | 服務器無法理解或處理該請求,因為客戶端請求語法錯誤、無效請求消息或欺騙性請求路由。 | 通用客戶端錯誤,需檢查請求格式、參數、JSON/XML結構等。 |
401 | Unauthorized | 請求要求身份驗證或身份驗證失敗。 | 響應通常包含 WWW-Authenticate 頭,告知客戶端需要的認證方式(如 Basic, Bearer)。表示“未認證”或“認證失敗”。 |
403 | Forbidden | 服務器理解請求,但拒絕執行(即使身份驗證成功)。 | 與 401 區別:用戶已登錄,但沒有訪問該資源的權限。 |
404 | Not Found | 服務器找不到請求的資源。 | 最常見錯誤之一。 URL 拼寫錯誤、資源已被刪除或從未存在。 |
405 | Method Not Allowed | 不支持的請求方法。 | 響應頭 Allow 會列出該資源支持的 HTTP 方法(如 GET, HEAD )。 |
408 | Request Timeout | 服務器等待客戶端發送請求的時間過長。 | 服務器主動關閉了連接。 |
409 | Conflict | 請求與服務器的當前狀態沖突(通常在 PUT/PATCH/DELETE 操作時發生)。 | 常見于并發編輯、版本控制沖突(如 If-Match 頭校驗失敗)。 |
429 | Too Many Requests | 用戶在給定的時間內發送了太多請求(“速率限制”)。 | 常用于 API 限流。 響應頭 Retry-After 可能提示客戶端何時可重試。 |
500 | Internal Server Error | 服務器遇到了一個未曾預料的情況,導致它無法完成對請求的處理。 | 最通用的服務器端錯誤。 程序代碼錯誤、依賴服務故障等。 |
502 | Bad Gateway | 服務器作為網關或代理,從上游服務器接收到無效響應。 | 常見于反向代理(如 Nginx)無法從后端應用服務器(如 PHP-FPM, Node.js)獲得有效響應。 |
503 | Service Unavailable | 服務器暫時不可用(通常由于過載或停機維護)。 | 表示服務當前無法處理請求,但這是臨時的。 響應頭 Retry-After 可能提示客戶端何時可重試。 |
504 | Gateway Timeout | 服務器作為網關或代理,未及時從上游服務器收到響應。 | 上游服務器處理超時(慢或無響應)。 |
507 | Insufficient Storage | 服務器無法存儲完成請求所必需的內容(WebDAV)。 | 通常表示磁盤空間不足。 |
請求重定向圖示
將請求重定向到新位置(301)
從給定的時間之后未修改過,則重定向為使用本地副本(304)
??幾個重定向狀態碼的區別(面試考點)
狀態碼 | 名稱 | 永久性 | HTTP 方法是否保留 | 典型場景 | SEO 影響 | 注意事項 |
---|---|---|---|---|---|---|
301 | Moved Permanently | ? 永久 | ? 可能改變 (POST → GET) | 域名永久遷移、URL 結構變更 | 權重轉移到新 URL (后續訪問跳過重定向用新URL,瀏覽器自動更新書簽) | 瀏覽器緩存重定向結果 |
302 | Found | ? 臨時 | ? 可能改變 (POST → GET) | 臨時活動也跳轉、A/B 測試 | 不傳遞權重,保留原 URL 索引(每次都重定向訪問,瀏覽器不會更新書簽) | 實際行為與語義不符,慎用于非 GET 請求 |
307 | Temporary Redirect | ? 臨時 | ? 嚴格保持原方法 | 臨時重定向且需保留請求方法 (如 POST 表單) | 不傳遞權重 (每次都重定向訪問,瀏覽器不會更新書簽) | 強制方法一致,適合 API 和敏感操作,比如支付 |
308 | Permanent Redirect | ? 永久 | ? 嚴格保持原方法 | 永久重定向且需保留請求方法 (如 RESTful API 遷移) | 權重轉移到新 URL(后續訪問跳過重定向用新URL,瀏覽器自動更新書簽) | 強制方法一致,瀏覽器緩存結果 |
請求和響應報文的區別
- 起始行:
請求行定義 “要做什么”(方法+資源路徑)。
狀態行聲明 “結果如何”(狀態碼+原因短語)。 - 首部字段:
請求關注 身份、數據類型、來源(如 Authorization, Accept)。
響應關注 數據類型、緩存、控制指令(如 Content-Type, Cache-Control)。 - 主體及用途:
請求 Body 用于 發送數據(如表單、文件)。
響應 Body 用于 返回數據(如資源內容、錯誤信息)。 - 傳輸方向性:
請求:客戶端發起 → 服務器接收。
響應:服務器返回 → 客戶端接收。
請求報文支持的各種方法
GET
HEAD
HEAD方法,服務器在響應中只返回首部,不會返回主體
部分。
允許客戶端再未獲取實際資源的情況下,對資源的首部進行檢查。
PUT
PUT向服務器寫入文檔。
用請求的主體創建URL命名的新文檔
:讓服務器用請求的主體部分來創建一個由所請求的URL命名的新文檔。若已存在,則用這個主體來替代它。
POST
向服務端輸入數據
TRACE
TRACE方法主要用于診斷
。客戶端發起的請求可能要穿過防火墻、代理、網關或其他應用程序,每個中間節點都可能修改原始HTTP請求。TRACE請求會在目的服務器端發起一個 “環回”診斷,彈回一條TRACE響應并在主體中攜帶它收到的原始請求報文,客戶端以此檢查原始報文是否被毀壞或被修改過。
OPTIONS
詢問服務器支持哪些方法
DELETE
請服務器刪除URL指定的資源
HTTP首部
通用首部
客戶端和服務器都可以使用,不論是構建請求報文還是響應報文。
1. 通用信息首部
2. 通用緩存首部
首部 | 作用說明 | 示例值 |
---|---|---|
Cache-Control | 控制緩存行為(優先級最高) | max-age=3600, no-cache |
Connection | 管理連接狀態(如 keep-alive 維持長連接;close 關閉連接) | Connection: keep-alive |
Content-Encoding | 內容壓縮格式(如 gzip /br ) | Content-Encoding: gzip |
Content-Length | Body 的字節長度(不含頭部) | Content-Length: 1024 |
Content-Type | Body 的媒體類型(如 JSON、HTML) | Content-Type: application/json |
Date | 報文創建時間 | Date: Tue, 15 Jun 2024 08:12:31 GMT |
請求首部
請求首部是只在請求報文中有意義的首部。
1. Accept首部
2. 條件請求首部
3. 安全請求首部
4. 代理請求首部
首部 | 作用說明 | 示例值 |
---|---|---|
Host | 目標域名和端口(HTTP/1.1 必需) | Host: www.example.com |
User-Agent | 客戶端標識(瀏覽器、操作系統等) | User-Agent: Chrome/125.0 |
Accept | 聲明可接受的響應格式(如 application/json ) | Accept: application/json |
Accept-Language | 聲明首選語言 | Accept-Language: zh-CN,en;q=0.9 |
Authorization | 身份憑證(如 Bearer Token) | Authorization: Bearer xyz123 |
Cookie | 攜帶服務端設置的 Cookie | Cookie: sessionId=abc; theme=dark |
Referer | 當前請求的來源頁面 URL | Referer: https://google.com/search?q=http |
If-Modified-Since | 條件請求:資源在此時間后修改才返回新內容 | If-Modified-Since: Tue, 14 Jun 2024 12:00:00 GMT |
響應首部
1. 協商首部
2. 安全響應首部
首部 | 作用說明 | 示例值 |
---|---|---|
Server | 服務端軟件信息 | Server: Nginx/1.24 |
Set-Cookie | 設置 Cookie(名稱、值、屬性) | Set-Cookie: id=a3fWa; Path=/; HttpOnly |
Location | 重定向目標 URL(用于 3xx 狀態碼) | Location: https://new.example.com |
Access-Control-Allow-Origin | CORS:允許跨域的源(* 表示任意源) | Access-Control-Allow-Origin: * |
Content-Security-Policy | CSP:限制資源加載來源(防 XSS) | default-src 'self'; script-src https: |
Strict-Transport-Security | HSTS:強制 HTTPS(瀏覽器記住此策略) | max-age=31536000; includeSubDomains |
Retry-After | 服務不可用時的重試等待時間(用于 503/429) | Retry-After: 60 |
實體首部
1. 內容首部
2. 實體緩存首部
首部 | 作用說明 | 示例值 |
---|---|---|
Content-Location | 返回資源的實際 URL(可能與請求 URL 不同) | Content-Location: /data/v2/user.json |
Content-Disposition | 指定如何處理內容(如下載文件名) | Content-Disposition: attachment; filename="report.pdf" |
Expires | 資源過期時間(舊版緩存控制,優先級低于 Cache-Control ) | Expires: Thu, 01 Dec 2024 16:00:00 GMT |
Last-Modified | 資源最后修改時間(用于緩存驗證) | Last-Modified: Mon, 10 Jun 2024 08:30:15 GMT |
??HTTP 首部核心作用(面試考點)
- 傳遞上下文:客戶端類型(
User-Agent
)、認證信息(Authorization
)。 - 內容協商:聲明支持的數據格式(
Accept
)、語言(Accept-Language
)。 - 行為控制:緩存策略(
Cache-Control
)、連接管理(Connection
)。 - 安全策略:CORS(
Access-Control-Allow-Origin
)、CSP(Content-Security-Policy
)。