【每日一題】說(shuō)說(shuō)開(kāi)發(fā)中常用的幾種 Content-Type?

人生苦短,總需要一點(diǎn)儀式感。比如學(xué)前端~
Content-Type 的定義
HTTP 的實(shí)體首部字段,用于說(shuō)明請(qǐng)求或返回的消息主體是何種方式編碼,在 request header(請(qǐng)求頭) 和 response header(響應(yīng)頭) 里存在。
幾種常見(jiàn)的類(lèi)型:
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
application/x-www-form-urlencoded
瀏覽器的原生 form 表單,如果不設(shè)置屬性,那么最終就會(huì)以application/x-www-form-urlencoded方式提交數(shù)據(jù),請(qǐng)求如上面的形式:
POST http://www.baidu.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
這種方式提交的數(shù)據(jù)放在 body 里面,數(shù)據(jù)按照key1=val1&key2=val2的方式進(jìn)行編碼,key 和 val 都進(jìn)行了 url 編碼
multipart/form-data
該種方式也是一種常見(jiàn)的 POST 提交方式,通常表單上傳文件時(shí)使用這種方式
使用表單上傳時(shí),必須讓 form 的 enctype 等于這個(gè)值
<form action="/" method="post" enctype="multipart/form-data">
<input type="text" name="description" value="some text" />
<input type="file" name="myFile" />
<button type="submit">Submit</button>
</form>
在請(qǐng)求頭這里看起來(lái)是這樣:
POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"
some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain
(content of the uploaded file foo.txt)
---------------------------974767299852498929531610575--
稍微分析下:
首先生成一個(gè) boundary 用于分割不同的字段,為了避免與正文內(nèi)容重復(fù),boundary 很長(zhǎng)很復(fù)雜
然后 content-Type 里指明了數(shù)據(jù)是以 multipart/from-data 來(lái)編碼,本次請(qǐng)求的 boundary 是什么內(nèi)容
消息主體里按照字段個(gè)數(shù)又分為多個(gè)結(jié)構(gòu)類(lèi)似的部分,每部分都是以 --boundary開(kāi)始,緊接著是內(nèi)容描述信息,然后是回車(chē),最后是字段具體內(nèi)容(文本或二進(jìn)制)
如果傳輸?shù)氖俏募?,還要包含文件名和文件類(lèi)型信息。消息主體最后以--boundary-- 標(biāo)識(shí)結(jié)束。
關(guān)于 multipart/form-data 的詳細(xì)定義,可前往 rfc1867 查看
application/json
application/json 作為響應(yīng)頭,現(xiàn)在越來(lái)越多的人把其作為請(qǐng)求頭,用來(lái)告訴服務(wù)器消息主體是序列化后的 json 字符串。請(qǐng)求類(lèi)似下面形式
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合 RESTful 的接口。各大抓包工具如 chrome 自帶的開(kāi)發(fā)者工具、Firebug、Fiddler,都以樹(shù)形結(jié)構(gòu)展示 JSON 數(shù)據(jù),非常友好。
text/xml
該種方式主要用來(lái)提交 XML 格式的數(shù)據(jù),請(qǐng)求形式如下:
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
顯然在 API 方面,現(xiàn)在 JSON 大有取代 XML 的意思,但是 XML 依然有其不可代替的領(lǐng)域。
所有《每日一題》的 知識(shí)大綱索引腦圖 整理在此:https://www.yuque.com/dfe_evernote/interview/everyday
你也可以點(diǎn)擊文末的 “閱讀原文” 快速跳轉(zhuǎn)

讓我們一起攜手同走前端路!
關(guān)注公眾號(hào)回復(fù)【加群】即可
