菜鳥面試必知的 http 知識(三)—— 請求和響應(yīng)報文

篇3介紹了HTTP的請求報文和響應(yīng)報文,重點是請求方法和狀態(tài)碼(我在面試阿里和騰訊分別被問到過),這其實就是HTTP協(xié)議的核心了!

用于HTTP協(xié)議交互的信息被稱為HTTP報文。請求端的HTTP報文叫做請求報文,響應(yīng)端的叫做響應(yīng)報文。HTTP報文大致可分為報文首部報文主體兩塊,如圖1所示。

圖1 - 請求報文和響應(yīng)報文的結(jié)構(gòu)

請求報文和響應(yīng)報文主要不同在于報文首部分別是請求行和狀態(tài)行,其含義如下:

  • 請求行:包含用于請求的方法,請求URI和HTTP版本
  • 狀態(tài)行:包含表明響應(yīng)結(jié)果的狀態(tài)碼,原因短語和HTTP版本
  • 首部字段:包含表示請求和響應(yīng)的各種條件和屬性的各類首部

下面以請求簡書博客地址為例,解釋請求報文和響應(yīng)報文

1 - 請求報文

請求報文是由請求方法、請求URI、協(xié)議版本、可選的請求首部字段和內(nèi)容實體組成的。

// 請求報文
GET http://www.itdecent.cn/u/d97a1dec9e2d   HTTP/1.1

// 請求首部字段
Host: www.itdecent.cn
Proxy-Connection: keep-alive
Accept: application/json
Chrome/57.0.2979.2 Safari/537.36
Referer: http://www.itdecent.cn/u/d97a1dec9e2d
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

// 內(nèi)容實體
Cookie: ...
name=binjiang&age=100

1.1 - HTTP請求方法

(1). GET:獲取資源
 GET方法用來請求訪問已被URI識別的資源,指定的資源經(jīng)服務(wù)端解析后返回響應(yīng)內(nèi)容。如果資源是文本、圖片,就直接返回;如果是接口程序,就返回執(zhí)行的結(jié)果。

(2). POST:傳輸實體主體
 POST方法用來傳輸實體的主體,盡管GET方法也可以傳輸實體的主體,但一般不用GET方法進行傳輸,而是POST方法。

這是因為GET提交,請求的數(shù)據(jù)會附在URI之后,而POST提交會把請求的數(shù)據(jù)放置在內(nèi)容實體中。因此,GET提交的數(shù)據(jù)會在地址欄中顯示出來,而POST提交,地址欄不會改變。
 同時,GET方法在特定瀏覽器和服務(wù)器對URL長度有限制,這也會導(dǎo)致POST可以傳輸?shù)膬?nèi)容更多一些。并且POST的安全性要比GET的安全性高。

(3). PUT:傳輸文件
 PUT方法用來傳輸文件。但是鑒于HTTP/1.1的PUT方法自身不帶驗證機制,任何人都可以上傳文件,存在安全性,因此一般的web網(wǎng)站不使用該方法。除非配合web應(yīng)用程序的驗證機制或是采用REST標準的網(wǎng)站架構(gòu)設(shè)計。

(4). HEAD:獲得報文首部
 HEAD方法和GET方法一樣,只是不返回報文主體部分。用于確認URI的有效性及資源更新的日期時間等。

(5). DELETE:刪除文件
 DELETE方法用來刪除文件,是與PUT相反的方法。同樣HTTP/1.1的DELETE方法自身不帶驗證機制,因此一般的web網(wǎng)站不使用該方法。

(6). OPTIONS:詢問支持的方法
 OPTIONS方法用來查詢針對URI指定的資源支持的方法。

(7). TRACE:追蹤路徑
 TRACE方法是讓web服務(wù)器端將之前的請求通信環(huán)回給客戶端的方法??蛻舳送ㄟ^TRACE方法可以查詢發(fā)送出去的請求是怎樣被加工修改/篡改的。這是因為,請求在連接到目標服務(wù)器的中途可能會經(jīng)過代理中轉(zhuǎn),TRACE方法就是用來確認連接過程中發(fā)生的一系列操作。

(8). CONNECT:要求用隧道協(xié)議連接代理
 CONNECT方法要求在與代理服務(wù)器通信時建立隧道,實現(xiàn)用隧道協(xié)議進行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接層)和TSL(Transport Layer Security,傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸


2 - 響應(yīng)報文

響應(yīng)報文是由協(xié)議版本、狀態(tài)碼、說明、可選響應(yīng)首部字段以及實體主體構(gòu)成。

HTTP/1.1    200    OK
// 響應(yīng)首部字段
Date: Mon, 13 Mar 2017 04:36:45 GMT
Content-Length: 362
Content-Type: text/html
// 主體
<html>
...

2.1 - HTTP狀態(tài)碼

狀態(tài)碼的作用是當客戶端向服務(wù)端發(fā)送請求后,服務(wù)端返回處理結(jié)果的狀態(tài)。因為客戶端需要知道服務(wù)端返回的是有效的還是錯誤的數(shù)據(jù),如果是錯誤的數(shù)據(jù),是客戶端的問題,還是服務(wù)端的問題。

類別 原因短語
1XX Informational(信息性狀態(tài)碼) 請求正在處理中
2XX Success 正常處理完畢
3XX Redirection 需要進行附加操作才算完成請求
4XX Client Error 客戶端發(fā)送的請求數(shù)據(jù)問題
5XX Server Error 服務(wù)端處理請求時出錯

這里面最需要關(guān)注的是4XX和5XX。因為在Web開發(fā)和調(diào)試過程中,不可避免會出現(xiàn)Bug,返回碼可以幫助快速定位到出錯點。例如經(jīng)常會出現(xiàn)的“404 Not Found”錯誤,表明了服務(wù)器上無法找到請求的資源,而服務(wù)器本身是正常工作的?!?01 Internal Server Error”表明服務(wù)器端在執(zhí)行請求時發(fā)生了錯誤,此時服務(wù)器并沒有正常工作。


3 - 首部字段含義

  • 通用首部字段(General Header Fields): 請求報文和響應(yīng)報文兩方都會使用的首部;
  • 請求首部字段(Request Header Fields): 從客戶端向服務(wù)器發(fā)送請求報文時使用的首部。補充了請求的附加內(nèi)容,客戶端的信息,響應(yīng)內(nèi)容相關(guān)的優(yōu)先級等信息。
  • 響應(yīng)首部字段(Response Header Fields): 從服務(wù)器向客戶端返回響應(yīng)報文時使用的首部。補充了響應(yīng)的附加內(nèi)容,也會要求客戶端附加額外的內(nèi)容信息。
  • 實體首部字段(Entity Header Fields): 針對請求報文和響應(yīng)報文的實體部分使用的首部。補充了資源內(nèi)容更新時間等與實體有關(guān)的信息。
3.1 - 通用首部字段
首部字段名 說明
Cache-Control 控制緩存的行為
Connection 逐跳首部,連接的管理
Date 創(chuàng)建報文的日期時間
Pragna 報文指令
Trailer 報文末端的首部一覽
Transfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級為其他協(xié)議
Via 代理服務(wù)器的相關(guān)信息
Warning 錯誤通知
3.2 - 請求首部字段
首部字段名 說明
Accept 用戶代理可處理的媒體類型
Accept—Charset 優(yōu)先的字符集
Accept-Encoding 優(yōu)先的內(nèi)容編碼
Accept-Language 優(yōu)先的語言(自然語言)
Authorization Web認證信息
Expect 期待服務(wù)器的指定行為
From 用戶的電子郵箱地址
Host 請求資源所在服務(wù)器
if-Match 比較實體標記(ETag)
if-Modified-Since 比較資源的更新時間
if-None-Match 比較實體標記(與if-Match相反)
if-Range 資源為更新時發(fā)送實體Byte的范圍請求
if-Unmodified-Since 比較資源的更新時間(與if-Modified-Since相反)
Max-Forwards 最大傳輸逐跳數(shù)
Proxy-Authorization 代理服務(wù)器要求客戶端的認證信息
Range 實體字節(jié)范圍請求
Referer 對請求中的URL的原始獲取方法
TE 傳輸編碼的優(yōu)先級
User-Agent HTTP客戶端程序的信息
3.3 - 響應(yīng)首部字段
首部字段名 說明
Accept-Ranges 是否接受字節(jié)范圍請求
Age 推算資源創(chuàng)建經(jīng)過時間
ETag 資源的匹配信息
Location 令客戶端重定向至指定的URL
Proxy-Authenticate 代理服務(wù)器對客戶端的認證信息
Rety-After 對再次發(fā)起請求的時機要求
Server HTTP服務(wù)器的安裝信息
Vary 代理服務(wù)器緩存的管理信息
WWW-Authenticate 服務(wù)器對客戶端的認證信息
3.4 - 實體首部字段
首部字段名 說明
Allow 資源科支持的HTTP方法
Content-Encoding 實體主體適用的編碼方式
Content-Language 實體主體的自然語言
Content-Length 實體主體的大?。▎挝唬鹤止?jié))
Content-Location 替代對資源的URL
Content-MD5 實體主體的報文摘要
Content-Range 實體主體的位置范圍
Content-Type 實體主體的媒體類型
Expires 實體主體過期的日期時間
Last-Modified 資源的最后修改日期時間

4 - Cookie服務(wù)的首部字段

首部字段名 說明 首部類型
Set-Cookie 開始狀態(tài)管理所有的Cookie信息 響應(yīng)首部字段
Cookie 服務(wù)器接收到的Cookie信息 請求首部字段
4.1 - Set-Cookie字段的屬性
屬性 說明
NAME=VALUE 賦予Cookie的名稱和其值
expires=DATE Cookie的有效期(若不mingque指定則默認為瀏覽器關(guān)閉前為止)
path=PATH 將服務(wù)器上的文件目錄作為Cookie的適用對象(若不指定則默認為文檔所在的目錄)
domain=域名 作為Cookie適用對象的域名(若不指定則默認為創(chuàng)建Cookie的服務(wù)器的域名)
Scure 僅在HTTPS安全通信時才會發(fā)送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript腳本訪問

大家好,我是彬彬醬,目前在騰訊從事Web后端開發(fā)。
菜鳥必知的 http 知識專題整理了關(guān)于網(wǎng)絡(luò)的基礎(chǔ)知識,適合大家進行入門級學(xué)習(xí),這個專題現(xiàn)包含下列文章:
菜鳥必知的 http 知識(一)—— TCP 握手協(xié)議
菜鳥必知的 http 知識(二)—— HTTP 協(xié)議特點
菜鳥必知的 http 知識(三)—— 請求和響應(yīng)報文
菜鳥必知的 http 知識(四)—— HTTP 和 HTTPS
菜鳥必知的 http 知識(五)—— 新技術(shù)的出現(xiàn)
菜鳥必知的 http 知識(六)—— web的結(jié)構(gòu)組件


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容