轉(zhuǎn):HTTP協(xié)議之multipart/form-data請求分析

首先來了解什么是multipart/form-data請求:

根據(jù)http/1.1rfc 2616的協(xié)議規(guī)定,我們的請求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那為為何我們還會有multipart/form-data請求之說呢?這就要從頭來說了。

http協(xié)議大家都知道是規(guī)定了以ASCII碼傳輸,建立在tcp、ip協(xié)議之上的應(yīng)用層規(guī)范,規(guī)范內(nèi)容把http請求分為3個部門:狀態(tài)行,請求頭,請求體。所有的方法、實現(xiàn)都是圍繞如何運用和組織這三部分來完成的。換句話來說就是萬變不離其中,只要我們了解了http請求的組成部分后,自然就可以應(yīng)變?nèi)魏螌嶋H工作中的需求和問題了。

關(guān)于狀態(tài)行,請求頭,請求體等三部分的具體內(nèi)容,大家可以參考官方的協(xié)議文檔http://www.faqs.org/rfcs/rfc2616.html,這里主要分析multipart/form-data請求具體是怎么一回事。

既然http協(xié)議本身的原始方法不支持multipart/form-data請求,那這個請求自然就是由這些原始的方法演變而來的,具體如何演變且看下文:

1、multipart/form-data的基礎(chǔ)方法是post,也就是說是由post方法來組合實現(xiàn)的

2、multipart/form-data與post方法的不同之處:請求頭,請求體。

3、multipart/form-data的請求頭必須包含一個特殊的頭信息:Content-Type,且其值也必須規(guī)定為multipart/form-data,同時還需要規(guī)定一個內(nèi)容分割符用于分割請求體中的多個post的內(nèi)容,如文件內(nèi)容和文本內(nèi)容自然需要分割開來,不然接收方就無法正常解析和還原這個文件了。具體的頭信息如下:

Content-Type: multipart/form-data; boundary=${bound}

//其中${bound} 是一個占位符,代表我們規(guī)定的分割符,可以自己任意規(guī)定,但為了避免和正常文本重復(fù)了,盡量要使用復(fù)雜一點的內(nèi)容。如:--------------------56423498738365

4、multipart/form-data的請求體也是一個字符串,不過和post的請求體不同的是它的構(gòu)造方式,post是簡單的name=value值連接,而multipart/form-data則是添加了分隔符等內(nèi)容的構(gòu)造體。具體格式如下:

--${bound}Content-Disposition: form-data; name="Filename"

HTTP.pdf

--${bound}

Content-Disposition: form-data; name="file000"; filename="HTTP協(xié)議詳解.pdf"

Content-Type: application/octet-stream

%PDF-1.5

file content

%%EOF

--${bound}

Content-Disposition: form-data; name="Upload"

Submit Query

--${bound}--

其中${bound}為之前頭信息中的分割符,如果頭信息中規(guī)定為123,那么這里也要為123,;可以很容易看出,這個請求體是多個相同的部分組成的:每一個部分都是以--加分隔符開始的,然后是該部分內(nèi)容的描述信息,然后一個回車,然后是描述信息的具體內(nèi)容;如果傳送的內(nèi)容是一個文件的話,那么還會包含文件名信息,以及文件內(nèi)容的類型。上面的第二個小部分其實是一個文件體的結(jié)構(gòu),最后會以--分割符--結(jié)尾,表示請求體結(jié)束。

綜上,可以知道要發(fā)送一個multipart/form-data的請求,其實任何支持post請求的工具或語言都可以支持,只是自己要稍微包裝一下便可。

真相如下:

用firefox上傳一個txt文件,內(nèi)容為123test,用firebug查看網(wǎng)絡(luò)請求細節(jié)。

請求頭:

請求體:

http里沒有專門用于文件上傳的請求方式,文件上傳請求是在post請求基礎(chǔ)之上定義出來的一種方式。Multipart是HTTP協(xié)議為web表單新增的上傳文件的協(xié)議,協(xié)議文檔是rfc1867,它基于HTTP的POST方法,數(shù)據(jù)同樣是放在body上,跟普通POST方法的區(qū)別是數(shù)據(jù)不是key=value形式,key=value形式難以表示文件實體,為此Multipart協(xié)議添加了分隔符(即boundary的概念),有自己的格式結(jié)構(gòu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容