當你需要提交文件、非 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 正文內容有沖突,它的作用是用來分隔不同的字段。
Body 體分為多個結構類似的部分,每一部分以 --boundary 開頭,因為本次請求生成的 boundary 為 ----WebKitFormBoundaryPAlLG7hJKNYc4ft3,所以最終是 ------WebKitFormBoundaryPAlLG7hJKNYc4ft3。接着是描述內容的元信息,包括字段名稱,如果是文件則還有文件名稱和文件類型。接着留一空行,然后才是字段值。什么時候結束呢,以 --boundary-- 標志結束。
這種方式本就是專為上傳文件的場景設計的,雖然你也可以使用這種方式傳遞普通數據,但無疑會增加不少數據包的大小(這么多 boundary 還是有不少空間占用的)。
適用場景:文件上傳
很明顯在 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"]}
適用場景:數據結構較復雜,層級較深的情況。