12 HTTP的實(shí)體數(shù)據(jù)
目錄
http的body
數(shù)據(jù)類型和編碼
HTTP協(xié)議為什么要關(guān)心 body
- TCP/IP 協(xié)議棧,傳輸數(shù)據(jù)基本格式:header+body。
- TCP、UDP是傳輸層協(xié)議,不關(guān)心body數(shù)據(jù)是什么,只要把數(shù)據(jù)發(fā)送給對(duì)方就算完成了任務(wù)。
- HTTP 協(xié)議是應(yīng)用層協(xié)議,數(shù)據(jù)到達(dá)只能說工作完成了一半,還需要告訴上層應(yīng)用,這是什么數(shù)據(jù),否則上層應(yīng)用不知所措。
MIME(Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型
- MIME 用在電子郵件中,可以讓電子郵件發(fā)送ASCII 碼以外的任意數(shù)據(jù),給數(shù)據(jù)定義了一個(gè)標(biāo)準(zhǔn)規(guī)范。
- MIME 把數(shù)據(jù)分為8大類,每個(gè)大類下再細(xì)分多個(gè)子類,形式為“type/subtype”的字符串,納入到了HTTP頭字段里。
- HTTP 使用了其中一部分,用來標(biāo)記 body 的數(shù)據(jù)類型,即 MIME type。
HTTP 常用數(shù)據(jù)類型 MIME type
- text
- 文本格式的可讀數(shù)據(jù)
- text/html 表示超文本文檔;text/plain 純文本;text/css 樣式表
- image
- 圖像文件
- image/gif;image/jpge; image/png
- audio/video
- 音頻和視頻數(shù)據(jù)
- audio/mpeg;video/mp4
- application
- 數(shù)據(jù)格式不固定,可能是文本也可能是二進(jìn)制,必須由上層應(yīng)用程序來解釋。
- application/json;application/javascript;application/pdf
- application/octetstream 不透明的二進(jìn)制數(shù)據(jù)
HTTP 常用的編碼格式 Encoding type
- HTTP 在傳輸時(shí)為了節(jié)約帶寬,有時(shí)還會(huì)壓縮數(shù)據(jù),為了不要讓瀏覽器繼續(xù)猜,還需要一個(gè)Encoding type,告訴數(shù)據(jù)用什么編碼格式,這樣對(duì)方才能正確解壓縮,還原出原始數(shù)據(jù)。
- 常用的Encoding type
- gzip:GNU zip 壓縮格式,最流行
- deflate:zlib 壓縮格式,也流行
- br:一種專門為HTTP優(yōu)化的新壓縮算法
數(shù)據(jù)類型使用的頭字段
有了MIME type和Encoding type,無論是瀏覽器還是服務(wù)器都可以很輕松識(shí)別出body的類型,這樣就能正確處理數(shù)據(jù)了。
為了客戶端和瀏覽器的“內(nèi)容協(xié)商”,HTTP協(xié)議定義了兩個(gè) Accept 請(qǐng)求頭字段和兩個(gè) Content 實(shí)體頭字段。
客戶端用Accept 頭告訴服務(wù)器希望接收到什么樣的數(shù)據(jù);服務(wù)器用 Content頭告訴客戶端實(shí)際發(fā)送了什么樣的數(shù)據(jù)。
舉例:
Request Headers:
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Response Hraders:
Content-Length: 718
Content-Type: text/plain; charset=UTF-8
語言類型和編碼
- 為了解決body 的語言“國(guó)際化”的問題,引入【語言類型和字符集】的概念。
- 語言類型:type-subtyoe,如英語,漢語,日語等
- en 任意英語
- en-US 美式英語
- en-GB 英式英語
- zh-CN 漢語
- 字符集:charset,如 ASCII,GBK,UTF-8 等
- 語言類型使用的頭字段
Accept-Language: zh-CN,zh;q=0.9
Content-Language:zh-CN
- 字符集在HTTP中使用的頭字段是 Accept-Charset ,但是響應(yīng)頭卻沒有對(duì)應(yīng)的Content-Charset,而是在 Content-Type 字段的數(shù)據(jù)類型后面用 charset=xxx 表示。
內(nèi)容協(xié)商的質(zhì)量值
- HTTP協(xié)議里用 Accept、Accept-Encoding、Accept-Language 等請(qǐng)求頭字段進(jìn)行內(nèi)容協(xié)商的時(shí)候,還可以用一種特殊的“q”參數(shù)表示權(quán)重來設(shè)定優(yōu)先級(jí)。
- “q”的含義,“quality factor”。
- 權(quán)重的取值:
- 最大 1;最小 0.01;默認(rèn)值為1,0表示拒絕
- 表示:; q=0.01
- 舉例:Accept:text/html,application/xml;q=0.9,/;q=0.8
- 它表示瀏覽器最希望使用的是 HTML文件,權(quán)重是1
- 其次是 xml 文件,權(quán)重是 0.9
- 最后是任意數(shù)據(jù)類型,權(quán)重是 0.8
- 服務(wù)器收到請(qǐng)求頭后,就會(huì)計(jì)算權(quán)重,再根據(jù)自己的實(shí)際情況優(yōu)先輸入 HTML 或 XML。
內(nèi)容協(xié)商的結(jié)果
- 內(nèi)容協(xié)商的過程是不透明的,每個(gè)web服務(wù)器使用的算法都不一樣
- 有時(shí)服務(wù)器會(huì)在響應(yīng)頭多加一個(gè) Vary 字段,記錄服務(wù)器在內(nèi)容協(xié)商時(shí)參考的請(qǐng)求字段,給出一些信息。
- 舉例:Vary:Accept-Encoding,User-Agent,Accept
- 表示:服務(wù)器依據(jù)上面三個(gè)字段,然后決定了發(fā)回的響應(yīng)報(bào)文。
浙公網(wǎng)安備 33010602011771號(hào)