1. 程式人生 > >常用HTTP請求欄位及場景筆記

常用HTTP請求欄位及場景筆記

1. Accept

定義:可以接收的返回資料型別。服務端會根據該欄位,選擇其支援的權重最高的內容形式返回。 示例: (1)可以是多個值,用逗號隔開,如

Accept: application/json, text/plain

(2)也可以增加權重,不設定權重則預設為1,如

Accept: application/json;q=0.5, text/plain

場景例項: 伺服器使用了spring的@ResponseBody註解,並且配置了xml、json的converter,如果此時accept為*/*,則伺服器會按自己的邏輯選擇converter,可能會返回application/xml格式的資料,如果客戶端只能處理json資料,則需要宣告為application/json,則伺服器會返回json格式的資料。

2. Accept-Encoding

定義:支援的內容編碼方式。 示例: (1)可以是多個值,用逗號隔開,也支援使用q表示權重,其中identify表示不壓縮

Accept-Encoding: gzip, compress, deflate, identify

(2)*表示任意

Accept-Encoding: *

作用:告知伺服器支援的編碼方式,伺服器可根據此對資料進行壓縮,減少傳輸時間。 場景例項: 使用nginx伺服器部署靜態資源,有時候會發現資原始檔太大,傳輸太慢。其實瀏覽器發起請求時已經帶上了Accept-Encoding: gzip, deflate,只要在nginx中開啟gzip則可以實現壓縮之後再傳輸。

3. Cache-Control

定義:控制快取的工作機制。 示例

Cache-Control: no-cache
Cache-Control: max-age=0
Cache-Control: public, no-cache, max-age=0

場景例項: 以nginx部署靜態資源為背景 (1)對於希望客戶端快取的檔案(強制快取),可以在nginx.conf中配置expires 30s,這樣nginx返回的響應頭中就會帶上Cache-control: max-age=30,瀏覽器接收到資料後會快取起來,並在30秒以內直接使用快取,30s過後再次請求會向伺服器請求校驗快取是否合法,伺服器可能返回新的資料或者返回304。 (2)對於希望客戶端快取但每次都要校驗是否過期的檔案(協商快取),可以在nginx.conf中配置expires 0s,這樣nginx返回的相應頭中就會帶上Cache-control: max-age=0,瀏覽器接收到資料後會快取起來,並在下一次請求時向伺服器請求校驗快取是否合法,伺服器可能返回新的資料或者返回304。 (3)每次通過在瀏覽器位址列輸入URL訪問資源,瀏覽器都會自動帶上Cache-control: no-cache的頭部欄位,意味著希望重新從目標伺服器獲取資源,而不從中間的代理伺服器中取快取資源。

4. If-Modified-Since

定義:校驗資源是否在指定時間後修改過 示例

If-Modified-Since: Wed, 10 Oct 2018 08:56:00 GMT

場景例項: 以下兩種情況快取均已過期 (1)上一個響應的頭部包含Cache-control: max-age=0時 (2)上一個響應的頭部包含Cache-control: max-age=30且30秒已過 需要再發一次請求到伺服器校驗資料是否被修改,此時請求需要帶上If-Modified-Since,值為上一個響應的Last-Modified欄位。伺服器檢查資源是否被修改,如果沒有返回304,如果被修改返回新的資源。

5. Connection

定義: (1)管理持久連線 (2)控制不再給代理的首部欄位 示例

Connection: Keep-Alive
Connection: close

Connection: Upgrade
Upgrade: Websocket

場景例項: (1)由於開啟一個網頁一般需要從同一個服務上獲取多個資源,請求頭會預設帶上Connection: Keep-Alive,表示重用TCP連線,當獲取最後一個資源時,不再需要該TCP連線時,可以帶上Connection: close。 (2)Upgrade: Websocket一般與Connection: Upgrade配合使用,只可作用於臨接伺服器。如果客戶端經過Nginx來請求目標伺服器,則到達目標服務的請求會沒有Upgrade: Websocket的頭部欄位,於是需要在nginx中配置為該請求加上這兩個請求頭部欄位,才能實現客戶端經過Nginx與目標伺服器進行websocket通訊。

6. Upgrade

定義:升級為其它協議 示例

Connection: Upgrade
Upgrade: Websocket

場景例項: (1)客戶端發起websocket連線時,會先發起一個HTTP請求,Upgrade欄位為websocket,伺服器判斷支援websocket後返回101,接下來使用websocket協議通訊。 (2)瀏覽器發起mqtt over websocket連線時,會先發起一個HTTP請求,Upgrade欄位為mqttv3.1,伺服器判斷是否支援該版本的mqtt協議決定是否繼續通訊。

7. Content-Length

定義:實體主體的長度,單位為byte。 示例

Content-Length: 1500

場景例項: 由於TCP會產生粘包,無法分割多個HTTP報文,就需要使用頭部的Content-Length欄位來判斷該HTTP請求到哪裡結束。當使用分片傳輸,或者報文經過壓縮時,沒有此欄位。

8. Host

定義:請求的域名 示例

Host: www.baidu.com

場景例項: 通常情況下,一個物理機器會部署了多個服務,我們通過Nginx監聽80埠,將不同域名的請求轉發到對應服務。當瀏覽器傳送一個HTTP請求時,會向DNS查詢IP地址,並把請求傳送到該IP地址的指定埠,此時會帶上Host欄位表明是哪個域名發起的請求,伺服器通過請求頭中的Host欄位來判斷應該轉發到哪個服務。

9. Origin

定義:請求的來源 示例

Origin: http://localhost

場景例項: 當網頁需要提交一個跨域POST請求(Content-Type為application/json),會先發送一個OPTION請求,並且帶上頭部欄位Origin,伺服器會檢查是否允許該源頭提交跨域請求,如果允許,返回200,否則返回403 Forbidden。

10. Referer

定義:請求是從哪個網頁發起的 示例

Referer: https://www.baidu.com/

場景例項: (1)伺服器可以通過此欄位來統計發起請求的來源 (2)可以通過該欄位來判斷是否跨站請求,如果是則禁止訪問來防止跨站請求偽造,但是由於該欄位可能會被篡改,所以不是特別可靠。

10. User-Agent

定義:提供瀏覽器型別及版本、作業系統及版本、瀏覽器核心、等資訊的標識。 示例

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36

場景例項: (1)當我們通過手機端訪問網頁和通過電腦訪問網頁,伺服器會根據UA來返回不一樣的結果來適配不同的客戶端/瀏覽器。 (2)伺服器可以根據UA來統計使用者使用的客戶端/瀏覽器資訊,從而更加註重該型別客戶端/瀏覽器的體驗。 (3)伺服器可以根據UA來判斷請求是否由網路爬蟲發出,如果UA的值不是普通的瀏覽器,則禁止訪問。但是,網路爬蟲也可以直接偽造UA的值來破解。