網(wǎng)絡(luò)協(xié)議之所以是叫做協(xié)議,而不是規(guī)定猫态,就是因?yàn)閭鬏斒裁磧?nèi)容佣蓉,前后端都得商量著來(lái)
客戶端需要什么,需要告訴服務(wù)端亲雪;服務(wù)端發(fā)什么給客戶端勇凭,要看客戶端能不能看懂
那他們又是怎么商量的呢?以前學(xué)習(xí)過(guò)HTTP協(xié)議的同學(xué)肯定知道义辕,是根據(jù)請(qǐng)求行來(lái)進(jìn)行協(xié)商的
而HTTP協(xié)議中又是怎么定義協(xié)商內(nèi)容的呢虾标?協(xié)商好之后又該怎么表述呢?
今天就來(lái)聊聊上面的這些個(gè)問(wèn)題灌砖,希望我的文字能讓你把這些內(nèi)容弄清楚
內(nèi)容協(xié)商
在HTTP中璧函,內(nèi)容協(xié)商分為2種,分別是主動(dòng)式內(nèi)容協(xié)商與響應(yīng)式內(nèi)容協(xié)商
之前沒(méi)接觸過(guò)的童鞋基显,聽(tīng)到這些名詞肯定是稀里糊涂的蘸吓,別著急,咱們一個(gè)一個(gè)的來(lái)
主動(dòng)式內(nèi)容協(xié)商
千言萬(wàn)語(yǔ)不如一張圖來(lái)的形象撩幽,先上張主動(dòng)式內(nèi)容協(xié)商的過(guò)程圖
起點(diǎn)是客戶端(Client)
库继,先看看圖,看不懂沒(méi)關(guān)系窜醉,有個(gè)印象就好了宪萄。不然接下來(lái)我說(shuō)的內(nèi)容,對(duì)你來(lái)說(shuō)可能就是天書(shū)了
這圖猛的一看挺復(fù)雜的榨惰,花里胡哨一大堆雨膨。其實(shí)過(guò)程非常簡(jiǎn)單
其實(shí)就是客戶端發(fā)起了一個(gè)HTTP1.1的GET
請(qǐng)求資源后,服務(wù)端返回資源的一個(gè)情況
發(fā)起GET請(qǐng)求后读串,通過(guò)Accept
、Accept-Language
撒妈、Accept-Encoding
這三個(gè)請(qǐng)求頭恢暖,客戶端告訴服務(wù)器:我現(xiàn)在要一個(gè)text/
類型的文件,并且我只接受這個(gè)文件語(yǔ)言為en(英語(yǔ))
狰右,我這里能看得懂的編碼格式只有br杰捂、gzip
格式,q(權(quán)重)
都是0.8
棋蚌,你(服務(wù)器)有哪種編碼格式隨便給我都行
服務(wù)器看到我們的要求嫁佳,根據(jù)我們的要求以及請(qǐng)求的URL挨队,就到這個(gè)URL里定位的資源,尋找是否有符合我們要求的資源
我們請(qǐng)求的URL在服務(wù)器是存在對(duì)應(yīng)文件的蒿往,所以告訴我們狀態(tài)碼是200盛垦,并且把URLe
對(duì)應(yīng)的資源給到了我們(客戶端)
告訴了我們這是個(gè)text/html
文件,語(yǔ)言是en
瓤漏,編碼方式為br
腾夯,均是符合我們上述提出的要求
我們(客戶端)拿到符合要求的文件,也就可以正常解析數(shù)據(jù)了
響應(yīng)式內(nèi)容協(xié)商
來(lái)蔬充,咱們?cè)賮?lái)看看什么是響應(yīng)式內(nèi)容協(xié)商蝶俱,還是老規(guī)矩,先上一張圖饥漫,韻個(gè)味
看懂了之前的主動(dòng)式內(nèi)容協(xié)商榨呆,我相信這張圖你也能看的七七八八。因?yàn)閰^(qū)別并不大
區(qū)別就在于Client(客戶端)
請(qǐng)求了之后庸队,居然給我們一個(gè)300(重定向)积蜻,而不是我們之前的200(OK)
居然還要我們?cè)偃フ?qǐng)求一次,才把URLe
的內(nèi)容給我們
其實(shí)這就是響應(yīng)式與主動(dòng)式的區(qū)別所在了
在響應(yīng)式內(nèi)容協(xié)商中皿哨,客戶端發(fā)送請(qǐng)求浅侨,服務(wù)器端無(wú)法抉擇要返回什么內(nèi)容,所以就把客戶端請(qǐng)求的URL對(duì)應(yīng)的資源列表全部返回证膨,然后由客戶端自行抉擇如输。客戶端進(jìn)行選擇后再去訪問(wèn)指定資源
而因?yàn)镽FC中沒(méi)有明確指出客戶端應(yīng)該依據(jù)怎樣的規(guī)則去對(duì)資源進(jìn)行抉擇央勒,所以各大瀏覽器的實(shí)現(xiàn)方式都不一致
又因?yàn)楦鞔鬄g覽器實(shí)現(xiàn)方式都不統(tǒng)一不见,相對(duì)來(lái)說(shuō),用到響應(yīng)式內(nèi)容協(xié)商的地方就很少了
質(zhì)量因子
上面有些內(nèi)容大家如果沒(méi)有學(xué)過(guò)HTTP協(xié)議崔步,會(huì)發(fā)現(xiàn)有些東西看不太明白稳吮,比如q
是什么玩意?
前面為了便于你們的理解井濒,我在最開(kāi)始出現(xiàn)的時(shí)候灶似,寫(xiě)了個(gè)注釋--權(quán)重
它本身的含義是表示內(nèi)容的質(zhì)量或者可接受因子的優(yōu)先級(jí)
內(nèi)容的質(zhì)量,就比如說(shuō)圖片展示的質(zhì)量:
若只需要展示供用戶快速瀏覽的縮略圖瑞你,我們可以對(duì)圖片進(jìn)行大范圍的壓縮酪惭,這樣圖片質(zhì)量會(huì)很低,質(zhì)量因子也很低
若為醫(yī)學(xué)用圖者甲,需要展示高清圖春感,我們不能丟失圖片細(xì)節(jié),圖片內(nèi)容質(zhì)量高,質(zhì)量因子自然也就很高了
可接受因子的優(yōu)先級(jí)鲫懒,最常用的就是字符編碼與語(yǔ)言的優(yōu)先級(jí)展示
這次就拿個(gè)實(shí)例來(lái)說(shuō)嫩实,這樣感觸也更深一點(diǎn)
Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.7,en;q=0.6
zh-cn:簡(jiǎn)體中文,zh:中文窥岩,這兩個(gè)質(zhì)量因子都是0.8甲献,但是優(yōu)先展示簡(jiǎn)體中文,如果服務(wù)器中沒(méi)有簡(jiǎn)體中文的資源谦秧,則尋找中文資源竟纳,若還是沒(méi)有該資源,則接著就是美式英語(yǔ)(en-us)疚鲤,最后再是展示英語(yǔ)(en)
總結(jié)來(lái)說(shuō):質(zhì)量因子越大锥累,意味著資源權(quán)重越高,越優(yōu)先展示集歇。質(zhì)量因子一致桶略,則排序在前面的先展示
常見(jiàn)的協(xié)商要素除了質(zhì)量因子之外,還有以下幾個(gè)請(qǐng)求頭
- 字符編碼
Accept-Charset:ISO8859-1,UTF-8;q=0.7,*;q=0.7
資源的編碼格式 - 內(nèi)容編碼
Accept-Encoding:gzip,br
主要指壓縮算法 - 表述語(yǔ)言
Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.7,en;q=0.6
前面已經(jīng)提到了诲宇,主要用于語(yǔ)言的優(yōu)先級(jí)展示
看懂前面的內(nèi)容了际歼,這三個(gè)應(yīng)該還算很好理解的吧
資源表述
我們要的資源也跟服務(wù)器要到了,那我們?cè)撛趺?strong>表述這個(gè)資源呢姑蓝?
注意我的用詞哦鹅心,是表述資源,不是解析資源
換句話說(shuō)纺荧,就是資源的自我介紹旭愧,告訴別人它是屬于哪一種編碼類型,內(nèi)容又是如何編碼的宙暇,對(duì)應(yīng)的是什么地方的語(yǔ)言
主要是通過(guò)以下三個(gè)頭字段來(lái)進(jìn)行資源的表述
- 媒體類型編碼
Content-type:text/html;charset=utf-8
- 內(nèi)容編碼
Content-encoding:gzip
- 語(yǔ)言
Content-Languague:zh;en
是不是有種似曾相識(shí)的感覺(jué)输枯?沒(méi)錯(cuò),上面我們?cè)诟嬖V服務(wù)端我們需要什么文件時(shí)占贫,請(qǐng)求頭上有三個(gè)字段與這三哥們特別相似
沒(méi)印象的可以往上面翻一翻桃熄,基本上就是Content
與Accept
一個(gè)單詞的區(qū)別
這也體現(xiàn)出了HTTP協(xié)議的特性,可讀性高與低門檻
Content
與Accept
就像是相親中的一男一女型奥,女方(Accept)提出要求瞳收,作為媒婆的服務(wù)器,就把符合條件的男方(Content)拿出來(lái)厢汹,男方把自己的簡(jiǎn)歷拿出來(lái)(Content-type等資源表述請(qǐng)求頭)缎讼,倆人對(duì)上眼了,自然也就過(guò)上了幸福生活(200 OK)
還記得十年前的上網(wǎng)環(huán)境么坑匠?經(jīng)常有小網(wǎng)站出現(xiàn)亂碼,其實(shí)就是因?yàn)槊襟w類型編碼格式不對(duì)導(dǎo)致
內(nèi)容編碼就是告訴我們客戶端/服務(wù)器所支持的編碼類型卧惜,假如客戶端不支持gzip的編碼厘灼,服務(wù)器發(fā)給客戶端gzip資源夹纫,客戶端拿到這東西,也看不懂這是啥玩意
最后一個(gè)Content-Language
我想大家都應(yīng)該熟悉的设凹,畢竟混跡互聯(lián)網(wǎng)這么長(zhǎng)時(shí)間舰讹,你就沒(méi)上過(guò)國(guó)外的小網(wǎng)站?
別想多了闪朱,我說(shuō)的是apple.com之流月匣,截圖以證清白!
寫(xiě)在最后
今天就寫(xiě)到這里了奋姿,內(nèi)容不算多锄开,但是也不算少了
網(wǎng)絡(luò)協(xié)議這東西還真的是不好寫(xiě),基礎(chǔ)的內(nèi)容實(shí)在太多了称诗。我想來(lái)想去萍悴,還是從實(shí)踐入手學(xué)習(xí)最快,就選了從我們每天都接觸的HTTP協(xié)議開(kāi)始說(shuō)起
比如說(shuō)狀態(tài)碼寓免,請(qǐng)求頭癣诱,響應(yīng)頭之類的這些特別基礎(chǔ)的東西,巴拉巴拉一大堆袜香,說(shuō)來(lái)說(shuō)去也說(shuō)不出什么花樣
本來(lái)協(xié)議這東西就很枯燥乏味撕予,一個(gè)寫(xiě)不好就成了文檔翻譯。干貨摻水真不是一件容易的事情
如果覺(jué)得寫(xiě)得不錯(cuò)蜈首,不要忘了點(diǎn)個(gè)好看喲