当谈论到上传数据时,我们会很自然的说出Json/XML
,但这些都是数据格式。但数据上传的方式却一直以来都被我忽略了。目前的了解是,普遍会使用四种常见方案编码本地数据,通过Content-Type
来指定数据的上传方式,同时通过Content-Length
来指定数据长度。
application/x-www-form-urlencoded
这应该是最常见的一种提交方式了。在原生的表单From
,如果不设置enctype
属性,默认就会采用这种方案来上传数据。其HTTP
请求信息如下:
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
titile=%E6%B5%8B%E8%AF%95&body=%E6%B5%8B%E8%AF%95
可以看出,Body
部分的数据经过URL
转码后,以key1=val1&key2=val2
的形式来编排。在很多情况下,这都是Post
的默认提交方式,但因为其采用三个字符来表示一个Non-ASCII
字符,所以效率相对低下。
multipart/form-data
表单的enctype
属性目前有两种属性值可选,一种默认是application/x-www-form-urlencoded
,另一种就是multipart/form-data
了。这个发送方式的设计初衷是用于支持向服务器发送二进制数据。其HTTP
请求信息如下:
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=aHR0cDovL3d3dy5leGFtcGxlLmNvbQ
--aHR0cDovL3d3dy5leGFtcGxlLmNvbQ
Content-Disposition: form-data; name="city"
Test
--aHR0cDovL3d3dy5leGFtcGxlLmNvbQ
Content-Disposition: form-data; name="file"; filename="test.png"
Content-Type: image/png
Content-Transfer-Encoding: binary
PNG ... content of test.png ...
--aHR0cDovL3d3dy5leGFtcGxlLmNvbQ--
从上面的例子可以看到,这种发送方式的格式包含多个Part
,每个Part
采用随机生成的--boundary
来分割,最后一行采用--boundary--
结尾。每个Part
都必须包含一个Content-Disposition
字段,这个字段包含一个type
和name
的参数,如果有文件上传的话,还需要额外多一个filename
的参数,其中type
的值就是form-data
。这里还可以看到发送图片的Part
还使用到了Content-Type
,如果在发送时能是被到二进制文件的类型,则会填写相应的类型值,识别不出来的话,会统一采用application/octet-stream
作为类型值,如若多个文件汇总为一个表单项,则会采用multipart/mixed
作为属性值。同时呢,如果Part
的内容跟默认的encoding
方式不同,则会有Content-Transfer-Encoding
属性来指定该Part
的编码方式。
application/json
和text/xml
这两种方式从名字就可以看出其传输内容,不多讲。
参考
https://imququ.com/post/four-ways-to-post-data-in-http.html
https://www.jianshu.com/p/29e38bcc8a1d