看一些开发文档,要求的POST数据格式指的是什么?前后端开发都需要了解下。
本文阅读大约 4 分钟
开发客户端程序的时候,我们最常用的 Http 协议的 2 个方法就是 GET 方法(也可以叫 GET 请求)和 POST 方法(也可以叫 POST 请求)。GET 方法我们一般用来传输一些简单的数据,POST 方法因为可以把参数放在 body 中,所以我们也常常用来提交复杂的表单信息,或者上传文件。
聊 POST 方法之前,我们先谈谈 GET 方法和 POST 方法有什么区别呢?
GET 方法与 POST 方法的区别
刚开始接触 GET 方法和 POST 方法的时候,有可能会觉得 POST 方法会比 GET 方法安全些,因为 GET 方法会直接把参数显示在浏览器的地址栏。
如图,https://www.baidu.com/s?wd=wechat
,我们搜索的百度的关键字wechat
就直接显示在浏览器的地址栏。但实际上,因为 GET 和 POST 都是基于 Http 协议的方法,他们的内容都会显示在报文上,所以安全上并没有什么差别。
但是我们传输数据的过程中,如何选择使用 GET 方法还是 POST 方法呢,我们可以这么考虑
GET 方法
- 数据长度:Http 协议规范
没有对URL长度进行限制
,但是不同的浏览器对于 URL 长度是有不同的长度限制,比如 Safari URL 最大长度限制为 80000 个字符,Chrome URL 最大长度限制为 8182 个字符,所以我们在使用 GET 方法的时候,数据长度可以看作有长度限制。 - 数据类型:
只支持文本
类型,而且使用时一些特殊符号需要 urlencode 转义
POST 方法
- 数据长度:Http 协议规定 POST 参数是放在 body 里的,所以对长度也
没有长度限制
。 - 数据类型:支持文本类型,支持 json,支持文件二进制流,所以也可以用于上传文件。
POST 方法我们常用的方法就是构造一个 form 表单,然后直接调用 Http 客户端的 POST 方法即可调用成功。接下来我们讲讲 POST 方法的一些不同的数据格式。
POST 方法的数据格式
一个简单的 POST
一个 POST 请求包含header(请求头)
和 body(请求体)
两部分,我们看看 POST 请求:
POST HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
username=admin&password=123456
上述请求中,请求头和请求内容是由一个“空行”隔开,实际上空行是一个\r\n\r\n
字符串。
在请求头中:
POST HTTP/1.1
包含了 HTTP 的方法 POST,协议版本号 Http 1.1 版本;Host
目标地址Content-Type
请求的数据格式
在请求体中:
username=admin&password=123456
看起来和 GET 请求的参数没什么区别,由&
符号分隔成的几组参数。请求体的内容很灵活,这里是简单的文本参数,也可以是文件二进制数据。
那么怎么区分 body 请求体的数据是什么数据呢,那我们就需要在请求头中写明Content-Type
数据类型,来表明是什么数据格式。
我们最常用的 POST 的几种数据格式:
- x-www-form-urlencode
- multipart/form-data
- application/json
x-www-form-urlencode
请求头:
Content-Type: x-www-form-urlencode
x-www-form-urlencode
是 form 表单默认的数据格式类型,form 表单数据被编码为 key/value 格式发送到服务器,如:key1=value1&key2=value2&keyn=valuen
。
其中 key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。
multipart/form-data
请求头:
Content-Type: multipart/form-data
multipart/form-data
主要用于在表单中上传文件,也可以和x-www-form-urlencode
一样,上传普通的 key/val 数据。
例如下面的请求格式:
POST HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"
admin
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="password"
123456
------WebKitFormBoundary7MA4YWxkTrZu0gW--
在数据请求头中,还会有一个boundary
分割线,这里是----WebKitFormBoundary7MA4YWxkTrZu0gW
。
在请求体中,请求体以boundary
开始,中间每个参数之间也是用boundary
来分隔,以boundary
结束。每个参数内容有描述信息,然后是一个空行,接着是参数的具体内容。
小总结
纯文本 key/val | 上传文件 | key/val 和上传文本混合 | |
---|---|---|---|
x-www-form-urlencode | 支持 | 单个文件 | 不支持 |
multipart/form-data | 支持 | 多个文件 | 支持 |
x-www-form-urlencode
请求体是纯文本或纯二进制文件流,一般用于纯文本参数的提交或者单个文件传输。
multipart/form-data
能够混合传输文本与二进制,相比于 x-www-form-urlencode,multipart/form-data 还能够多文件传输。
application/json
请求头:
Content-Type: application/json
现如今很多移动客户端或者小程序客户端,开发者会用到 json 作为页面的数据格式,在使用 POST 方法时,在请求头添加它作为请求头,也可以告诉服务端请求数据为 JSON,后端开发语言也有很多函数去支持这种结构化数据。例如:
POST HTTP/1.1
Host: 127.0.0.1:8500
Content-Type: application/json
{"username":"admin","password":123456}
这种数据格式的请求体内容为 json 字符串。
总结
POST 请求的数据格式主要分 2 部分,一部分是请求头中,在Content-Type
中说明请求的数据格式,另一部分就是对应的请求体的内容,可以是简单 key/val 文本,也可以是文件二进制流。
本篇文章介绍的是客户端发送 POST 请求的一些不同的数据格式,开发者可以在开发过程中根据具体需求来选择。