面試官:說說 HTTP 常見的請(qǐng)求頭有哪些?
本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題 」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。
一、是什么
HTTP頭字段(HTTP header fields),是指在超文本傳輸協(xié)議(HTTP)的請(qǐng)求和響應(yīng)消息中的消息頭部分
它們定義了一個(gè)超文本傳輸協(xié)議事務(wù)中的操作參數(shù)
HTTP頭部字段可以自己根據(jù)需要定義,因此可能在 Web服務(wù)器和瀏覽器上發(fā)現(xiàn)非標(biāo)準(zhǔn)的頭字段
下面是一個(gè)HTTP請(qǐng)求的請(qǐng)求頭:
- GET /home.html HTTP/1.1
- Host: developer.mozilla.org
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Language: en-US,en;q=0.5
- Accept-Encoding: gzip, deflate, br
- Referer: https://developer.mozilla.org/testpage.html
- Connection: keep-alive
- Upgrade-Insecure-Requests: 1
- If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
- If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
- Cache-Control: max-age=0
二、分類
常見的請(qǐng)求字段如下表所示:
字段名 | 說明 | 示例 |
---|---|---|
Accept | 能夠接受的回應(yīng)內(nèi)容類型(Content-Types) | Accept: text/plain |
Accept-Charset | 能夠接受的字符集 | Accept-Charset: utf-8 |
Accept-Encoding | 能夠接受的編碼方式列表 | Accept-Encoding: gzip, deflate |
Accept-Language | 能夠接受的回應(yīng)內(nèi)容的自然語言列表 | Accept-Language: en-US |
Authorization | 用于超文本傳輸協(xié)議的認(rèn)證的認(rèn)證信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 用來指定在這次的請(qǐng)求/響應(yīng)鏈中的所有緩存機(jī)制 都必須 遵守的指令 | Cache-Control: no-cache |
Connection | 該瀏覽器想要優(yōu)先使用的連接類型 | Connection: keep-alive Connection: Upgrade |
Cookie | 服務(wù)器通過 Set- Cookie (下文詳述)發(fā)送的一個(gè) 超文本傳輸協(xié)議Cookie | Cookie: $Version=1; Skin=new; |
Content-Length | 以 八位字節(jié)數(shù)組 (8位的字節(jié))表示的請(qǐng)求體的長度 | Content-Length: 348 |
Content-Type | 請(qǐng)求體的 多媒體類型 | Content-Type: application/x-www-form-urlencoded |
Date | 發(fā)送該消息的日期和時(shí)間 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
Expect | 表明客戶端要求服務(wù)器做出特定的行為 | Expect: 100-continue |
Host | 服務(wù)器的域名(用于虛擬主機(jī) ),以及服務(wù)器所監(jiān)聽的傳輸控制協(xié)議端口號(hào) | Host: en.wikipedia.org:80 Host: en.wikipedia.org |
If-Match | 僅當(dāng)客戶端提供的實(shí)體與服務(wù)器上對(duì)應(yīng)的實(shí)體相匹配時(shí),才進(jìn)行對(duì)應(yīng)的操作。主要作用時(shí),用作像 PUT 這樣的方法中,僅當(dāng)從用戶上次更新某個(gè)資源以來,該資源未被修改的情況下,才更新該資源 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Modified-Since | 允許在對(duì)應(yīng)的內(nèi)容未被修改的情況下返回304未修改 | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
If-None-Match | 允許在對(duì)應(yīng)的內(nèi)容未被修改的情況下返回304未修改 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Range | 如果該實(shí)體未被修改過,則向我發(fā)送我所缺少的那一個(gè)或多個(gè)部分;否則,發(fā)送整個(gè)新的實(shí)體 | If-Range: "737060cd8c284d8af7ad3082f209582d" |
Range | 僅請(qǐng)求某個(gè)實(shí)體的一部分 | Range: bytes=500-999 |
User-Agent | 瀏覽器的瀏覽器身份標(biāo)識(shí)字符串 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0 |
Origin | 發(fā)起一個(gè)針對(duì) 跨來源資源共享 的請(qǐng)求 | Origin: http://www.example-social-network.com |
三、使用場景
通過配合請(qǐng)求頭和響應(yīng)頭,可以滿足一些場景的功能實(shí)現(xiàn):
協(xié)商緩存
協(xié)商緩存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】這兩對(duì)請(qǐng)求頭響應(yīng)頭來管理的
Last-Modified 表示本地文件最后修改日期,瀏覽器會(huì)在request header加上If-Modified-Since(上次返回的Last-Modified的值),詢問服務(wù)器在該日期后資源是否有更新,有更新的話就會(huì)將新的資源發(fā)送回來
Etag就像一個(gè)指紋,資源變化都會(huì)導(dǎo)致ETag變化,跟最后修改時(shí)間沒有關(guān)系,ETag可以保證每一個(gè)資源是唯一的
If-None-Match的header會(huì)將上次返回的Etag發(fā)送給服務(wù)器,詢問該資源的Etag是否有更新,有變動(dòng)就會(huì)發(fā)送新的資源回來
而強(qiáng)制緩存不需要發(fā)送請(qǐng)求到服務(wù)端,根據(jù)請(qǐng)求頭expires和cache-control判斷是否命中強(qiáng)緩存
強(qiáng)制緩存與協(xié)商緩存的流程圖如下所示:
會(huì)話狀態(tài)
cookie,類型為「小型文本文件」,指某些網(wǎng)站為了辨別用戶身份而儲(chǔ)存在用戶本地終端上的數(shù)據(jù),通過響應(yīng)頭set-cookie決定
作為一段一般不超過 4KB 的小型文本數(shù)據(jù),它由一個(gè)名稱(Name)、一個(gè)值(Value)和其它幾個(gè)用于控制 Cookie有效期、安全性、使用范圍的可選屬性組成
Cookie 主要用于以下三個(gè)方面:
會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)、購物車、游戲分?jǐn)?shù)或其它需要記錄的信息)
個(gè)性化設(shè)置(如用戶自定義設(shè)置、主題等)
瀏覽器行為跟蹤(如跟蹤分析用戶行為等
參考文獻(xiàn)
https://zh.wikipedia.org/wiki/HTTP頭字段
https://github.com/amandakelake/blog/issues/41