POST 請求的三種常見數據提交格式

本文所講的 POST 請求是 HTTP/1.1 協議中規定的衆多 HTTP 請求方法的其中最經常使用的一個。通常使用 POST 請求方法向服務器發送數據(主要是一些建立更新操做),本文討論的是 POST 請求方法經常使用的四種數據提交格式。json

因爲 HTTP/1.1 協議中並無對請求使用什麼編碼方式進行規定,因此理論上開發者徹底能夠本身決定請求的 Body 體使用什麼格式,固然實際上你們都仍是用通用的那麼幾種編碼方式來提交數據(生態很關鍵)。瀏覽器

注:如下排名不分前後。。。bash

application/x-www-form-urlencoded

對於瀏覽器原生的 form 表單,enctype 的值不指定的話,默認就是這個傢伙。實際上大部分狀況都使用它便可,編碼方式足夠簡單高效,各方面支持也都很完備,如各大瀏覽器調試工具、各大抓包軟件等。服務器

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

key1=val1&key2=val2
複製代碼

基本的請求相似上面這樣,數據的編碼方式採用 key1=val1&key2=val2 的形式,對其中的鍵值對都須要使用 URL Encode 編碼一下。其實就是和 GET 請求的數據提交格式是同樣的,只不過位置從 Request URL 上換到了 Request Body 裏。數據結構

這種格式結構簡單,但對於數據層級較深的狀況,好比一些有複雜層級關係的接口數據,這種方式就顯得有點力不從心了。另外一方面,對於須要上傳二進制數據(好比圖像、音頻等文件),這種方式就不那麼高效了,並且對於非 ASCII 碼的數據就丟失了,因此傳文件的狀況就不能使用這種方式。app

適用場景:數據量不大、數據層級不深的狀況下強烈建議這種數據提交格式。工具

multipart/form-data

當你須要提交文件、非 ASCII 碼的數據或者是二進制流數據,則使用這種提交方式。相似下面這個請求示例:編碼

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryPAlLG7hJKNYc4ft3

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

demo
------WebKitFormBoundaryPAlLG7hJKNYc4ft3
Content-Disposition: form-data; name="file"; filename="demo.png"
Content-Type: image/png


------WebKitFormBoundaryPAlLG7hJKNYc4ft3--
複製代碼

第二行指定編碼方式 Content-Type 爲 multipart/form-data,緊接着生成一個分界線 boundary 即 ----WebKitFormBoundaryPAlLG7hJKNYc4ft3,又臭又長的目的是爲了不和 Body 正文內容有衝突,它的做用是用來分隔不一樣的字段。url

Body 體分爲多個結構相似的部分,每一部分以 --boundary 開頭,由於本次請求生成的 boundary 爲 ----WebKitFormBoundaryPAlLG7hJKNYc4ft3,因此最終是 ------WebKitFormBoundaryPAlLG7hJKNYc4ft3。接着是描述內容的元信息,包括字段名稱,若是是文件則還有文件名稱和文件類型。接着留一空行,而後纔是字段值。何時結束呢,以 --boundary-- 標誌結束。spa

這種方式本就是專爲上傳文件的場景設計的,雖然你也可使用這種方式傳遞普通數據,但無疑會增長很多數據包的大小(這麼多 boundary 仍是有很多空間佔用的)。

適用場景:文件上傳。

application/json

很明顯在 JSON 格式火以前,確定沒有它的,前面說到使用什麼提交數據方式是沒有硬性規定的,因此在 JSON 格式火了之後,尤爲以其優秀的數據結構表達能力,逐漸流行開來,如今咱們對它徹底不會陌生。

POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8

{"name":"xfly","age": 24, "hobby":["x","xx","xxx"]}
複製代碼

適用場景:數據結構較複雜,層級較深的狀況。

相關文章
相關標籤/搜索