面試官您好!HTTP是超文本傳輸協議,是互聯網上客戶端和服務器之間傳輸超文本數據(比如文字、圖片、音頻、視頻等)的核心協議,當前互聯網應用最廣泛的版本是HTTP1.1,它基于經典的C/S模型,也就是客戶端-服務器模型,一次完整的HTTP通信包含客戶端發起請求到服務器響應的全過程。
首先來看客戶端發起的HTTP請求報文。請求報文由客戶端(比如瀏覽器、App)向服務器發起,主要由四個部分構成:請求行、請求頭、空行和請求體。
第一部分是請求行,主要功能是說明客戶端對服務器資源執行的操作。它由方法(Method)、資源路徑(Resource Path)、HTTP版本三個部分構成,每部分用空格隔開。
- 請求方法定義操作類型,比如常見的GET用于獲取資源(像瀏覽器訪問網頁),POST用于提交數據(如登錄時發送賬號密碼)。
- **URI(統一資源標識符)**即資源路徑,標識請求針對的資源,例如
/api/user
指向用戶數據接口。 - HTTP版本常見的有1.1、2.0等,例如
HTTP/1.1
表示使用該版本的通信規則。
第二部分是請求頭,由多行key:value鍵值對組成,每行以回車換行(\r\n)符號分割,類似快遞單上的額外備注信息,傳遞請求的附加信息。常見字段包括:
- User-Agent:告訴服務器客戶端類型(如Chrome瀏覽器或手機App),方便服務器返回適配內容。
- Content-Type:說明請求體的數據格式,比如
application/json
表示請求體是JSON數據。 - Host:請求的服務器域名,用于區分同一IP下的不同站點。
- Accept:客戶端能處理的媒體類型,如
text/html
表示可接收網頁內容。 - Accept-Encoding:客戶端支持的內容編碼,如
gzip
表示可接收壓縮數據。 - Authorization:用于身份驗證的憑證(如登錄令牌),服務器通過它識別用戶權限。
- Cookie:客戶端存儲的會話信息(如登錄態),服務器通過它維持用戶會話。
每行\r\n
的作用像表格換行,確保每個鍵值對獨立清晰。
第三部分是空行,僅有一個\r\n
,是請求頭部和請求正文的分隔符,明確劃分不同區域的界限。
第四部分是請求正文,存放客戶端提交的數據,格式靈活,可以是普通字符串、JSON、XML等。例如登錄時提交的賬號密碼(JSON格式)、上傳文件的二進制數據,都通過請求正文傳遞給服務器,GET請求通常沒有請求體。
服務器收到請求后,會返回響應報文,響應報文同樣包含四個部分:
第一部分是狀態行,格式為協議版本+狀態碼+狀態短語,例如HTTP/1.1 200 OK
。
- 狀態碼是核心反饋結果:2xx表示成功(如200 OK),3xx表示重定向(如302 Found),4xx表示客戶端錯誤(如404 Not Found資源不存在),5xx表示服務器錯誤(如500 Internal Server Error)。
第二部分是響應頭,也是多行key:value鍵值對,傳遞結果附加信息。例如:
- Content-Type:響應體的數據類型(如
application/json
表示接口返回JSON數據)。 - Cache-Control:緩存策略(如
max-age=3600
表示客戶端可緩存響應1小時)。 - Set-Cookie:服務器給客戶端設置的Cookie(如登錄態),用于維持會話。
- Access-Control-Allow-Origin:跨域資源共享策略(如
*
表示允許所有域名跨域訪問)。
第三部分是空行,同樣用\r\n
分隔響應頭和響應體。
第四部分是響應體,是服務器返回的核心數據,可能是HTML頁面代碼、JSON接口結果、圖片/視頻二進制數據等。例如訪問網頁時,響應體包含HTML代碼,瀏覽器解析后渲染頁面。
二、HTTP有哪些請求方式?
面試官您好!HTTP請求方式是客戶端對服務器資源的操作指令,不同方法對應不同語義,可按功能分為三類,同時涉及安全性和冪等性概念。
先明確兩個核心概念:
- 安全性:是否會修改服務器資源狀態(“讀操作”安全,“寫操作”不安全)。
- 冪等性:多次執行同一請求,服務器資源狀態是否一致(冪等方法結果不變,非冪等可能改變)。
(一)讀操作(安全、冪等)
-
GET
- 用途:獲取資源(查數據),如瀏覽器訪問網頁
GET https://www.example.com
或API查列表GET /api/articles
。 - 特點:參數拼在URL(如
?id=123
),可緩存、易分享,但敏感數據易暴露(如密碼不能用GET傳遞)。 - 安全/冪等:安全(僅讀取)、冪等(多次請求結果一致)。
- 用途:獲取資源(查數據),如瀏覽器訪問網頁
-
HEAD
- 用途:僅獲取響應頭(不返回正文),用于檢查資源元數據(如
HEAD /file.zip
查看文件是否存在、大小)。 - 特點:輕量高效,常做“預檢”(如下載大文件前確認信息)。
- 安全/冪等:安全(僅讀頭)、冪等(多次請求頭信息不變)。
- 用途:僅獲取響應頭(不返回正文),用于檢查資源元數據(如
(二)寫操作(非安全,部分冪等)
-
POST
- 用途:提交數據創建資源(寫操作),如登錄表單
POST /api/login
、上傳文件。 - 特點:數據放請求體(相對隱蔽),但非冪等(多次提交可能創建多條數據,如重復下單)。
- 安全/冪等:非安全(修改狀態)、非冪等。
- 用途:提交數據創建資源(寫操作),如登錄表單
-
PUT
- 用途:全量更新資源(替換數據),如修改用戶資料
PUT /api/user/123
(需傳完整信息)。 - 特點:冪等(多次用相同數據更新,結果一致)。
- 安全/冪等:非安全(修改狀態)、冪等。
- 用途:全量更新資源(替換數據),如修改用戶資料
-
PATCH
- 用途:局部更新資源(修改部分字段),如改用戶昵稱
PATCH /api/user/123
(僅傳{"nickname":"new"}
)。 - 特點:靈活高效,但非冪等(多次調用持續修改,如多次“積分+10”)。
- 安全/冪等:非安全、非冪等。
- 用途:局部更新資源(修改部分字段),如改用戶昵稱
-
DELETE
- 用途:刪除資源,如刪訂單
DELETE /api/order/123
。 - 特點:冪等(多次刪除結果一致,資源已刪除)。
- 安全/冪等:非安全、冪等。
- 用途:刪除資源,如刪訂單
(三)控制操作(安全、冪等)
- OPTIONS
- 用途:查詢服務器支持的方法,常用于跨域預檢(如前端發POST前,瀏覽器自動發OPTIONS詢問權限)。
- 特點:無實際業務邏輯,僅協商規則。
- 安全/冪等:安全(不修改狀態)、冪等。
實際場景選擇:遵循RESTful規范,查數據用GET,創建用POST,全量更新用PUT,局部更新用PATCH,刪除用DELETE。例如電商系統中,查商品用GET,下單用POST,改地址用PUT,刪訂單用DELETE,語義清晰且符合規范。
三、GET請求和POST請求的區別
面試官您好!GET和POST是最常用的HTTP方法,核心區別體現在用途、數據傳遞、安全、冪等性等方面,結合場景選擇能避免設計誤區。
(一)五大核心差異
維度 | GET | POST |
---|---|---|
核心用途 | 讀資源(查數據,如查商品詳情) | 寫資源(提交數據,如下單、登錄) |
數據位置 | 拼在URL(如?keyword=手機 ) | 放請求體(如JSON格式的賬號密碼) |
安全性 | 低(參數暴露在URL,易被記錄) | 中(數據在體內,但HTTP不加密) |
冪等性 | 冪等(多次請求結果一致) | 非冪等(多次提交可能重復創建) |
緩存支持 | 可緩存(瀏覽器自動存URL響應) | 默認不緩存(需顯式設置) |
(二)逐場景解析
-
用途與數據傳遞:
- GET適合讀操作,如瀏覽網頁
GET https://example.com/article/123
,參數在URL清晰可見,適合公開場景(如搜索關鍵詞)。 - POST適合寫操作,如登錄
POST /api/login
,賬號密碼放請求體,避免暴露在URL(但需配合HTTPS加密才安全)。
- GET適合讀操作,如瀏覽網頁
-
安全性對比:
- GET的URL參數會被瀏覽器歷史、服務器日志記錄,公共網絡下傳敏感數據(如密碼)風險極高。
- POST的數據在請求體,抓包工具雖能截取,但配合HTTPS加密(TLS層)可保障安全(如電商支付場景必須用POST+HTTPS)。
-
冪等性與緩存:
- GET冪等,多次刷新商品詳情頁不會改變服務器數據;POST非冪等,重復提交訂單會生成多個記錄。
- GET響應可被瀏覽器緩存,提升性能(如新聞列表頁);POST默認不緩存,因寫操作結果可能每次不同。
(三)典型場景選擇
- 選GET:查公開數據(如商品搜索)、需緩存的頁面(如靜態資源)、支持書簽分享的場景(如文章鏈接)。
- 選POST:提交敏感數據(如登錄、支付)、傳大量數據(如上傳文件)、改變服務器狀態的操作(如發布評論)。
反例提醒:避免用GET傳密碼(URL暴露風險),也不建議用POST做查詢(違背語義,團隊協作易困惑)。遵循HTTP方法的設計初衷,能讓接口更健壯、易維護。
總結
HTTP報文結構是通信的“骨架”,請求方法是操作的“靈魂”,GET/POST的差異則是實際開發的“指南針”。理解這些細節,不僅能應對面試,更能在實際項目中設計出高效、安全的接口,例如通過請求頭緩存控制提升性能,或用HTTPS+POST保障敏感數據傳輸。