簡(jiǎn)介

接下來(lái),本文會(huì)向大家闡述 HTTP 請(qǐng)求中的“請(qǐng)求頭”(headers)的概念,并通過(guò)實(shí)例來(lái)幫助大家理解。讓本文直接進(jìn)入主題。
想必大家都知道,在進(jìn)行 API 調(diào)用的過(guò)程中,本文實(shí)際上是在通過(guò)一個(gè)“信封”傳遞信息??梢园堰@個(gè)“信封”想象成一個(gè)客戶端和服務(wù)器之間的交流媒介,客戶端是發(fā)件人,服務(wù)器是收件人。
在這個(gè)“信封”里面裝的,就是本文要從客戶端發(fā)送到服務(wù)器的數(shù)據(jù)。但就像本文平時(shí)寄信一樣,在信封上除了寫明收件人的地址,還會(huì)有一個(gè)退件地址,以防信件無(wú)法送達(dá)時(shí)使用。
這個(gè)比喻是為了幫助大家理解請(qǐng)求頭(headers)的作用。在網(wǎng)絡(luò)通信中,請(qǐng)求頭就相當(dāng)于信封上的地址標(biāo)簽,它告訴服務(wù)器數(shù)據(jù)要發(fā)送到哪里,同時(shí)也提供了一些額外的信息,以便在數(shù)據(jù)無(wú)法正常送達(dá)時(shí)能夠找到正確的處理方式。
為了更好地理解請(qǐng)求頭,本文可以將其分為四大類。

- Request Headers
- Response Headers
- Payload Headers
- Representation Headers
請(qǐng)求頭和響應(yīng)頭之間并沒(méi)有絕對(duì)的界限,它們可以相互轉(zhuǎn)換。接下來(lái),本文將深入了解每一種頭具體代表的意義。
Request Headers
它就像其他頭部一樣,是一個(gè)鍵值對(duì),由請(qǐng)求數(shù)據(jù)的客戶端發(fā)送。發(fā)送它的目的是讓服務(wù)器理解如何發(fā)送響應(yīng)。它還有助于服務(wù)器識(shí)別請(qǐng)求的發(fā)送者。
以下是一些請(qǐng)求頭的示例:
- Host(主機(jī)): www.medium.com
- User-Agent(用戶代理): Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36 Referer
- (引薦頁(yè)): https://medium.com
- Connection(連接): close(關(guān)閉)
- Accept-Language(接受語(yǔ)言): en-us(英語(yǔ)美國(guó))
- Accept-Encoding(接受編碼): gzip(壓縮格式)
需要注意的是,Content-Type 并不是請(qǐng)求頭,而是一種表示頭。這一點(diǎn)可能會(huì)引起混淆,但了解這一點(diǎn)對(duì)理解 HTTP 通信非常重要。
通過(guò)上述示例,本文可以看到 Host 和 User-Agent 頭包含了發(fā)起請(qǐng)求的客戶端信息。
Accept-Language 頭則是用來(lái)告訴服務(wù)器,客戶端能夠理解響應(yīng)內(nèi)容的語(yǔ)言,例如這里的 en-us 表示英語(yǔ)(美國(guó))。而 Accept-Encoding 頭則表明,即使服務(wù)器發(fā)送的是經(jīng)過(guò) gzip 壓縮的數(shù)據(jù),客戶端也能夠正確解析和理解。
Response Headers
它們就像請(qǐng)求頭部一樣,只不過(guò)傳輸?shù)姆较蛳喾?。?shí)際上,這些頭部是服務(wù)器發(fā)送給客戶端的。它向客戶端解釋了如何處理響應(yīng)。它提供了有關(guān)發(fā)送的數(shù)據(jù)的額外信息。
響應(yīng)頭部的示例:
- Connection: keep-alive
- Date: Mon, 08 Nov 2022
- Server: nginx
- Content-Type: text/html
- Transfer-Encoding: chunked
- Etag: W/"0815"
Etag 用于版本控制和緩存。Date 告訴客戶端響應(yīng)從服務(wù)器發(fā)送到客戶端的日期。但是 Content-Type 或 Content-Encoding 是本文稍后將要討論的表示頭部。
Representation Headers
Representation headers 表示已傳輸數(shù)據(jù)的類型。從服務(wù)器發(fā)送到客戶端的數(shù)據(jù)可以是任何格式,比如 JSON、HTML、XML、分塊(如果數(shù)據(jù)量很大)等。服務(wù)器還告訴客戶端有關(guān)內(nèi)容的范圍。
表示頭部的示例:
- Content-Type: text/html
- Content-Encoding: gzip
- Content-Length: 3523
- Content-Range: bytes 50–1000/*
- Content-Location: /docs/fo.xml
Content-Location 告訴客戶端有關(guān)資源或數(shù)據(jù)的備用位置,客戶端可以從中檢索信息。它可以是存儲(chǔ)特定資源的 URL。
除了這些頭部之外,還可以有不同的頭部,比如 Trailer、Transfer-Encoding、Etag、if-Not-Match、Authorizations 等。
現(xiàn)在,如果您正在編寫 API,并且想要定義自己的自定義頭部呢?您可以完全做到。就像您定義 API 的請(qǐng)求和響應(yīng)結(jié)構(gòu)的方式一樣,您也可以實(shí)現(xiàn)服務(wù)器接受的自定義頭部,或者您自己定義的自定義頭部。
自定義頭部的一個(gè)示例可能是 Authorization 頭部。該頭部可以具有任何值。此外,服務(wù)器可以使用該值來(lái)識(shí)別客戶端,或者用于任何其他邏輯操作。