HTTP(Hypertext Transfer Protocol掂墓,超文本傳輸協(xié)議)是用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù)的一種協(xié)議谦纱,對(duì)于網(wǎng)絡(luò)開(kāi)發(fā)人員來(lái)說(shuō),理解這一協(xié)議是至關(guān)重要的君编。由于其廣泛的應(yīng)用跨嘉,除了在網(wǎng)頁(yè)應(yīng)用傳輸數(shù)據(jù)之外,它還被應(yīng)用于物聯(lián)網(wǎng)(IoT)中的數(shù)據(jù)和命令傳輸吃嘿。
HTTP 協(xié)議的第一個(gè)版本只有一個(gè)方法祠乃,即 GET,用于從服務(wù)器請(qǐng)求頁(yè)面兑燥。服務(wù)器的響應(yīng)總是一個(gè) HTML 頁(yè)面亮瓷。要了解 HTTP 協(xié)議最初的簡(jiǎn)單設(shè)計(jì),請(qǐng)參閱原始規(guī)范贪嫂,該規(guī)范文檔僅有一頁(yè)寺庄。
從最初的 0.9 版本開(kāi)始,HTTP 已經(jīng)發(fā)展了幾個(gè)版本力崇。當(dāng)前的版本是 1.1斗塘,并于 2014 年最后一次修訂。
工作原理
HTTP作為互聯(lián)網(wǎng)協(xié)議之一亮靴,它是基于文本的命令和響應(yīng)協(xié)議馍盟,使用客戶端-服務(wù)器通信模型。
客戶端發(fā)出請(qǐng)求茧吊,服務(wù)器做出響應(yīng)贞岭。HTTP 協(xié)議是無(wú)狀態(tài)協(xié)議八毯,意味著服務(wù)器不需要存儲(chǔ)會(huì)話信息,每個(gè)請(qǐng)求都是獨(dú)立的瞄桨。更多信息
這意味著:
所有請(qǐng)求來(lái)自客戶端(如您的瀏覽器)话速。
服務(wù)器對(duì)請(qǐng)求作出響應(yīng)。
請(qǐng)求(命令)和響應(yīng)均為可讀文本格式芯侥。
請(qǐng)求彼此獨(dú)立泊交,服務(wù)器不需要跟蹤請(qǐng)求。
請(qǐng)求與響應(yīng)結(jié)構(gòu)
請(qǐng)求和響應(yīng)的消息結(jié)構(gòu)相同柱查,如下所示:
一個(gè)請(qǐng)求包括:
命令或請(qǐng)求+可選的頭部+可選的內(nèi)容體廓俭。
一個(gè)響應(yīng)包括:
狀態(tài)碼+可選的頭部+可選的內(nèi)容體。
使用簡(jiǎn)單的CRLF(回車和換行)組合來(lái)分隔各部分唉工,單獨(dú)的空行(CRLF)表示頭部結(jié)束研乒。
如果請(qǐng)求或響應(yīng)包含消息體,則這一情況在頭部中表明淋硝。
消息體的存在通過(guò)內(nèi)容長(zhǎng)度(Content-Length)或傳輸編碼(Transfer-Encoding)頭域來(lái)信號(hào)化雹熬。請(qǐng)求消息的構(gòu)架與方法語(yǔ)義無(wú)關(guān),即使該方法沒(méi)有定義任何消息體的用途奖地。 – 參見(jiàn)RFC 7230第 3.3 節(jié)橄唬。
請(qǐng)注意:消息體后不跟隨 CRLF。參見(jiàn)RFC 7230第 3.5 節(jié)参歹。
HTTP 請(qǐng)求詳解
我們之前已經(jīng)看到了一般的請(qǐng)求和響應(yīng)格式仰楚,現(xiàn)在我們將更詳細(xì)地介紹請(qǐng)求消息。
起始行是必須的犬庇,其結(jié)構(gòu)如下:
方法+ 資源路徑 + 協(xié)議版本
例如僧界,如果我們嘗試訪問(wèn)www.testsite5.com上的網(wǎng)頁(yè) testpage.htm,請(qǐng)求的起始行將是:
GET /test.htm HTTP/1.1
其中:
GET是方法
/testpage.htm是資源的相對(duì)路徑
HTTP/1.1是我們使用的協(xié)議版本
注釋:
相對(duì)路徑不包括域名臭挽。
Web 瀏覽器使用我們輸入的 URL 來(lái)創(chuàng)建資源的相對(duì) URI捂襟。
注意:URL(統(tǒng)一資源定位符)用于網(wǎng)頁(yè),它是URI(統(tǒng)一資源標(biāo)識(shí)符)的一個(gè)例子欢峰。
瀏覽器實(shí)際上不顯示 HTTP 請(qǐng)求葬荷,只能通過(guò)特殊工具如http header live(Firefox)查看。
HTTP 與 URL
大多數(shù)人熟悉在 Web 瀏覽器中輸入 URL纽帖。通吵桎觯看起來(lái)像這樣:
URL 還可以包含通常由瀏覽器隱藏的端口,但您可以手動(dòng)包括它懊直,如下圖所示:
這告知網(wǎng)頁(yè)瀏覽器資源的地址以及檢索資源所使用的協(xié)議(HTTP)扒吁。
HTTP是從服務(wù)器到客戶端傳輸資源(網(wǎng)頁(yè)、圖片室囊、視頻等)的傳輸協(xié)議雕崩。
HTTP 響應(yīng)和響應(yīng)代碼
每個(gè)請(qǐng)求都有一個(gè)響應(yīng)魁索。響應(yīng)包括:
狀態(tài)碼和描述
一個(gè)或多個(gè)可選的頭部
可選的消息主體,可以包括多行盼铁,甚至二進(jìn)制數(shù)據(jù)
響應(yīng)狀態(tài)碼分為 5 組粗蔚,每組有其含義和三位數(shù)字代碼:
1xx– 信息性
2xx– 成功
3xx– 多種選擇
4xx– 客戶端錯(cuò)誤
5xx– 服務(wù)器錯(cuò)誤
例如,一個(gè)成功的頁(yè)面請(qǐng)求將返回一個(gè)200響應(yīng)碼捉貌,一個(gè)不成功的請(qǐng)求將返回一個(gè)400響應(yīng)碼支鸡。
您可以在這里找到完整的列表及其含義。
請(qǐng)求響應(yīng)示例
我們將檢查訪問(wèn)簡(jiǎn)單網(wǎng)頁(yè)(testpage.htm)時(shí)的請(qǐng)求和響應(yīng)趁窃。
這是我在瀏覽器地址欄中輸入的:
這是瀏覽器顯示的響應(yīng):
以下是幕后發(fā)生的HTTP請(qǐng)求-響應(yīng)的屏幕截圖:
注意,瀏覽器自動(dòng)插入請(qǐng)求頭急前,同樣地醒陆,Web 服務(wù)器也自動(dòng)插入響應(yīng)頭。請(qǐng)求中沒(méi)有正文內(nèi)容裆针。響應(yīng)中的正文內(nèi)容是網(wǎng)頁(yè)刨摩,在瀏覽器中顯示,并不由實(shí)時(shí)頭部工具顯示世吨。
請(qǐng)求類型
到目前為止澡刹,我們還未提及請(qǐng)求類型,但我們?cè)谑纠幸呀?jīng)見(jiàn)到了 GET 請(qǐng)求類型耘婚。
GET請(qǐng)求類型或方法用于從 Web 服務(wù)器請(qǐng)求資源罢浇。GET 是最常用的請(qǐng)求類型,并且是原始 HTTP 規(guī)范中唯一的請(qǐng)求類型沐祷。
請(qǐng)求類型嚷闭、方法或動(dòng)詞
HTTP 協(xié)議現(xiàn)在支持 8 種請(qǐng)求類型,也稱為方法或動(dòng)詞赖临,它們是:
GET – 從服務(wù)器請(qǐng)求資源
POST – 向服務(wù)器提交資源(例如胞锰,文件上傳)
PUT – 與 POST相似,但用于替換資源
DELETE – 從服務(wù)器刪除資源
HEAD – 類似 GET兢榨,但只返回頭部而不返回內(nèi)容
OPTIONS – 獲取資源的選項(xiàng)
PATCH – 對(duì)資源應(yīng)用修改
TRACE – 執(zhí)行消息回環(huán)
在今天的 Internet 上嗅榕,GET(獲取網(wǎng)頁(yè))和POST(提交 Web 表單)方法是最常使用的。
其他方法在與 Web 和物聯(lián)網(wǎng) APIs 工作時(shí)使用吵聪,尤其是 PUT凌那、DELETE 和 HEAD。