摘要:協(xié)議采用了請(qǐng)求響應(yīng)模型。報(bào)頭分為通用報(bào)頭,請(qǐng)求報(bào)頭,響應(yīng)報(bào)頭和實(shí)體報(bào)頭。格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。例如下面這段代碼最終發(fā)送的請(qǐng)求是這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合的接口。
一 前言
----現(xiàn)在搞前端的不學(xué)好http有關(guān)的知識(shí)已經(jīng)不行啦~筆者也是后知后覺(jué),在搞node的時(shí)候意識(shí)到網(wǎng)絡(luò)方面的薄弱,開(kāi)始學(xué)起http相關(guān)知識(shí)。這一篇是非常基礎(chǔ)的講解,適合入門(mén)人員掌握content-type的知識(shí)和有經(jīng)驗(yàn)的人員查閱。可以說(shuō),弄懂了content-type,你才能在學(xué)習(xí)http的道路上走的更加順暢,讓我們滿懷激情的開(kāi)始吧~~
二 正文 1.認(rèn)識(shí)content-type要學(xué)習(xí)content-type,必須事先知道它到底是什么,是干什么用的。
HTTP協(xié)議(RFC2616)采用了請(qǐng)求/響應(yīng)模型。客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求,請(qǐng)求頭包含請(qǐng)求的方法、URI、協(xié)議版本、以及包含請(qǐng)求修飾符、客戶信息和內(nèi)容的類(lèi)似于MIME的消息結(jié)構(gòu)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),相應(yīng)的內(nèi)容包括消息協(xié)議的版本,成功或者錯(cuò)誤編碼加上包含服務(wù)器信息、實(shí)體元信息以 及可能的實(shí)體內(nèi)容。
通常HTTP消息由一個(gè)起始行,一個(gè)或者多個(gè)頭域,一個(gè)只是頭域結(jié)束的空行和可選的消息體組成。
HTTP的頭域包括通用頭,請(qǐng)求頭,響應(yīng)頭和實(shí)體頭四個(gè)部分。每個(gè)頭域由一個(gè)域名,冒號(hào)(:)和域值三部分組成。域名是大小寫(xiě)無(wú)關(guān)的,域值前可以添加任何數(shù)量的空格符,頭域可以被擴(kuò)展為多行,在每行開(kāi)始處,使用至少一個(gè)空格或制表符。
請(qǐng)求消息和響應(yīng)消息都可以包含實(shí)體信息,實(shí)體信息一般由實(shí)體頭域和實(shí)體組成。實(shí)體頭域包含關(guān)于實(shí)體的原信息,實(shí)體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。
Content-Type是返回消息中非常重要的內(nèi)容,表示后面的文檔屬于什么MIME類(lèi)型。Content-Type: [type]/[subtype]; parameter。例如最常見(jiàn)的就是text/html,它的意思是說(shuō)返回的內(nèi)容是文本類(lèi)型,這個(gè)文本又是HTML格式的。原則上瀏覽器會(huì)根據(jù)Content-Type來(lái)決定如何顯示返回的消息體內(nèi)容。
2.Content-type與Accept(1)Accept屬于請(qǐng)求頭, Content-Type屬于實(shí)體頭。
Http報(bào)頭分為通用報(bào)頭,請(qǐng)求報(bào)頭,響應(yīng)報(bào)頭和實(shí)體報(bào)頭。
請(qǐng)求方的http報(bào)頭結(jié)構(gòu):通用報(bào)頭|請(qǐng)求報(bào)頭|實(shí)體報(bào)頭
響應(yīng)方的http報(bào)頭結(jié)構(gòu):通用報(bào)頭|響應(yīng)報(bào)頭|實(shí)體報(bào)頭
(2)Accept代表發(fā)送端(客戶端)希望接受的數(shù)據(jù)類(lèi)型。
比如:Accept:text/xml;
代表客戶端希望接受的數(shù)據(jù)類(lèi)型是xml類(lèi)型
Content-Type代表發(fā)送端(客戶端|服務(wù)器)發(fā)送的實(shí)體數(shù)據(jù)的數(shù)據(jù)類(lèi)型。
比如:Content-Type:text/html;
代表發(fā)送端發(fā)送的數(shù)據(jù)格式是html。
二者合起來(lái),
Accept:text/xml;
Content-Type:text/html
即代表希望接受的數(shù)據(jù)類(lèi)型是xml格式,本次請(qǐng)求發(fā)送的數(shù)據(jù)的數(shù)據(jù)格式是html。
更全面的請(qǐng)?jiān)L問(wèn):http://www.runoob.com/http/ht...
常見(jiàn)的媒體格式類(lèi)型如下:
text/html : HTML格式 text/plain :純文本格式 text/xml : XML格式 image/gif :gif圖片格式 image/jpeg :jpg圖片格式 image/png:png圖片格式
以application開(kāi)頭的媒體格式類(lèi)型:
application/xhtml+xml :XHTML格式 application/xml : XML數(shù)據(jù)格式 application/atom+xml :Atom XML聚合格式 application/json : JSON數(shù)據(jù)格式 application/pdf :pdf格式 application/msword : Word文檔格式 application/octet-stream : 二進(jìn)制流數(shù)據(jù)(如常見(jiàn)的文件下載) application/x-www-form-urlencoded :
直接來(lái)看一個(gè)生成的請(qǐng)求示例:
POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="text" title ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
首先生成了一個(gè) boundary 用于分割不同的字段,為了避免與正文內(nèi)容重復(fù),boundary 很長(zhǎng)很復(fù)雜。
然后 Content-Type 里指明了數(shù)據(jù)是以 mutipart/form-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)示結(jié)束。關(guān)于 mutipart/form-data 的詳細(xì)定義,請(qǐng)前往 rfc1867 查看。
這種方式一般用來(lái)上傳文件,各大服務(wù)端語(yǔ)言對(duì)它也有著良好的支持。
上面提到的這兩種 POST 數(shù)據(jù)的方式,都是瀏覽器原生支持的,而且現(xiàn)階段原生 form 表單也只支持這兩種方式。但是隨著越來(lái)越多的 Web 站點(diǎn),尤其是 WebApp,全部使用 Ajax 進(jìn)行數(shù)據(jù)交互之后,我們完全可以定義新的數(shù)據(jù)提交方式,給開(kāi)發(fā)帶來(lái)更多便利。
(3)application/json
application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生。實(shí)際上,現(xiàn)在越來(lái)越多的人把它作為請(qǐng)求頭,用來(lái)告訴服務(wù)端消息主體是序列化后的 JSON 字符串。由于 JSON 規(guī)范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務(wù)端語(yǔ)言也都有處理 JSON 的函數(shù),使用 JSON 不會(huì)遇上什么麻煩。
JSON 格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。記得我?guī)啄昵白鲆粋€(gè)項(xiàng)目時(shí),需要提交的數(shù)據(jù)層次非常深,我就是把數(shù)據(jù) JSON 序列化之后來(lái)提交的。不過(guò)當(dāng)時(shí)我是把 JSON 字符串作為 val,仍然放在鍵值對(duì)里,以 x-www-form-urlencoded 方式提交。
Google 的 AngularJS 中的 Ajax 功能,默認(rèn)就是提交 JSON 字符串。例如下面這段代碼:
var data = {"title":"test", "sub" : [1,2,3]}; $http.post(url, data).success(function(result) { ... });
最終發(fā)送的請(qǐng)求是:
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,都會(huì)以樹(shù)形結(jié)構(gòu)展示 JSON 數(shù)據(jù),非常友好。但也有些服務(wù)端語(yǔ)言還沒(méi)有支持這種方式,例如 php 就無(wú)法通過(guò) $_POST 對(duì)象從上面的請(qǐng)求中獲得內(nèi)容。這時(shí)候,需要自己動(dòng)手處理下:在請(qǐng)求頭中 Content-Type 為 application/json 時(shí),從 php://input 里獲得原始輸入流,再 json_decode 成對(duì)象。一些 php 框架已經(jīng)開(kāi)始這么做了。
(4)text/xml
它是一種使用 HTTP 作為傳輸協(xié)議,XML 作為編碼方式的遠(yuǎn)程調(diào)用規(guī)范。典型的 XML-RPC 請(qǐng)求是這樣的:
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
examples.getStateName 41
XML-RPC 協(xié)議簡(jiǎn)單、功能夠用,各種語(yǔ)言的實(shí)現(xiàn)都有。它的使用也很廣泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服務(wù)等等。JavaScript 中,也有現(xiàn)成的庫(kù)支持以這種方式進(jìn)行數(shù)據(jù)交互,能很好的支持已有的 XML-RPC 服務(wù)。不過(guò),我個(gè)人覺(jué)得 XML 結(jié)構(gòu)還是過(guò)于臃腫,一般場(chǎng)景用 JSON 會(huì)更靈活方便。
RFC2616:https://www.w3.org/Protocols/...
內(nèi)容參考:
(1)http://blog.csdn.net/bluehear...
(2)https://www.topjishu.com/6324...
(3)http://blog.csdn.net/muzizong...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/107077.html
摘要:規(guī)范把請(qǐng)求分為三個(gè)部分狀態(tài)行請(qǐng)求頭消息主體。消息主體最后以標(biāo)示結(jié)束。格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。例如下面這段代碼最終發(fā)送的請(qǐng)求是這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合的接口。 Content-Type HTTP 協(xié)議是以 ASCII 碼傳輸,建立在 TCP/IP 協(xié)議之上的應(yīng)用層規(guī)范。規(guī)范把 HTTP 請(qǐng)求分為三個(gè)部分:狀態(tài)行、請(qǐng)求頭、消息主體。類(lèi)...
摘要:入門(mén)一在中查看請(qǐng)求與響應(yīng)本文簡(jiǎn)單總結(jié)的請(qǐng)求與響應(yīng)。服務(wù)器與瀏覽器的交互瀏覽器負(fù)責(zé)發(fā)起請(qǐng)求服務(wù)器在端口接收請(qǐng)求服務(wù)器負(fù)責(zé)返回內(nèi)容響應(yīng)瀏覽器負(fù)責(zé)下載響應(yīng)內(nèi)容協(xié)議的作用就是指導(dǎo)瀏覽器和服務(wù)器如何進(jìn)行溝通。請(qǐng)求使用來(lái)在里創(chuàng)造一個(gè)請(qǐng)求,并得到響應(yīng)。 HTTP入門(mén)(一):在Bash中curl查看請(qǐng)求與響應(yīng) showImg(https://segmentfault.com/img/remote/14...
閱讀 1558·2021-11-17 09:33
閱讀 1111·2021-11-12 10:36
閱讀 2421·2019-08-30 15:54
閱讀 2445·2019-08-30 13:14
閱讀 2919·2019-08-26 14:05
閱讀 3296·2019-08-26 11:32
閱讀 3010·2019-08-26 10:09
閱讀 3004·2019-08-26 10:09