POST提交数据的方式

当谈论到上传数据时,我们会很自然的说出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字段,这个字段包含一个typename的参数,如果有文件上传的话,还需要额外多一个filename的参数,其中type的值就是form-data。这里还可以看到发送图片的Part还使用到了Content-Type,如果在发送时能是被到二进制文件的类型,则会填写相应的类型值,识别不出来的话,会统一采用application/octet-stream作为类型值,如若多个文件汇总为一个表单项,则会采用multipart/mixed作为属性值。同时呢,如果Part的内容跟默认的encoding方式不同,则会有Content-Transfer-Encoding属性来指定该Part的编码方式。

application/jsontext/xml

这两种方式从名字就可以看出其传输内容,不多讲。

参考
https://imququ.com/post/four-ways-to-post-data-in-http.html
https://www.jianshu.com/p/29e38bcc8a1d

你可能感兴趣的:(前端)