当你需要提交文件、非 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"]}
适用场景:数据结构较复杂,层级较深的情况。