HTTP:資源是怎么協(xié)商槽华、表述的壹蔓?

網(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ò)AcceptAccept-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)印象的可以往上面翻一翻桃熄,基本上就是ContentAccept一個(gè)單詞的區(qū)別

這也體現(xiàn)出了HTTP協(xié)議的特性,可讀性高與低門檻

ContentAccept就像是相親中的一男一女型奥,女方(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è)好看喲

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末实抡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疾就,更是在濱河造成了極大的恐慌澜术,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猬腰,死亡現(xiàn)場(chǎng)離奇詭異鸟废,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)姑荷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門盒延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鼠冕,你說(shuō)我怎么就攤上這事添寺。” “怎么了懈费?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵计露,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)票罐,這世上最難降的妖魔是什么叉趣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮该押,結(jié)果婚禮上疗杉,老公的妹妹穿的比我還像新娘。我一直安慰自己蚕礼,他們只是感情好烟具,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奠蹬,像睡著了一般朝聋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罩润,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天玖翅,我揣著相機(jī)與錄音,去河邊找鬼割以。 笑死金度,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的严沥。 我是一名探鬼主播猜极,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼消玄!你這毒婦竟也來(lái)了跟伏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翩瓜,失蹤者是張志新(化名)和其女友劉穎受扳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兔跌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勘高,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坟桅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片华望。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仅乓,靈堂內(nèi)的尸體忽然破棺而出赖舟,到底是詐尸還是另有隱情,我是刑警寧澤夸楣,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布宾抓,位于F島的核電站子漩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏石洗。R本人自食惡果不足惜痛单,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劲腿。 院中可真熱鬧,春花似錦鸟妙、人聲如沸焦人。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)花椭。三九已至,卻和暖如春房午,著一層夾襖步出監(jiān)牢的瞬間矿辽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工郭厌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袋倔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓折柠,卻偏偏與公主長(zhǎng)得像宾娜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扇售,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高前塔,建議使用雙通...
    有涯逐無(wú)涯閱讀 2,533評(píng)論 0 6
  • 一.HTTP1.0和HTTP1.1的區(qū)別 (1)長(zhǎng)連接 HTTP/1.0協(xié)議使用非持久連接,即在非持久連接下,一個(gè)...
    肆意咯咯咯閱讀 4,019評(píng)論 0 8
  • Web 頁(yè)面的實(shí)現(xiàn) Web 基于 HTTP 協(xié)議通信 客戶端(Client)的 Web 瀏覽器從 Web 服務(wù)器端...
    毛圈閱讀 1,082評(píng)論 0 2
  • 請(qǐng)求首部字段 請(qǐng)求首部字段是從客戶端往服務(wù)器端發(fā)送請(qǐng)求報(bào)文中所使用的字段华弓, 用于補(bǔ)充請(qǐng)求的附加信息、客戶端信息困乒、對(duì)...
    THINKA閱讀 290評(píng)論 0 0
  • http協(xié)議有http0.9寂屏,http1.0,http1.1和http2三個(gè)版本顶燕,但是現(xiàn)在瀏覽器使用的是htt...
    一現(xiàn)_閱讀 1,861評(píng)論 0 3