Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data
- 前端代码
- 请求消息(Request):
- application/x-www-form-urlencoded
- Context-Lenghth
- content-type
- 关于百分号编码
- multipart/form-data
在用POST提交表单时,常常遇到提交时content-tpyes是application/x-www-form-urlencoded和multipart/form-data的情况。
其本质的区别在于消息体的编码
application/x-www-form-urlencoded采用 “名称=值”=的组合以&项链,其中,名称和值经过了百分号编码
而multipart/form-data不会对参数编码,使用的boundary(分割线),相当于&
前端代码
<form name="input" action="#" method="POST">
Username: <input type="text" name="user">
<input type="text" name="password">
<input type="submit" value="Submit">
</form>
我们输入账号:努力的shiki
密码:123456
通过使用Filddle4抓包我们可以看见:
请求消息(Request):
可以一一对应来学习:
application/x-www-form-urlencoded
通过POST方法发送的请求消息中包含消息体。与响应消息一样、消息头和消息体用空行分隔,POST方法发送的值被放在请求的消息体(请求数据)中
与POST发送值相关的消息头为Context-Lenghth和Content-Type:
Context-Lenghth
- Context-Lenghth 为消息体的字节数
content-type
- content-type 为发送至的MIME类型,可通过HTML的form元素设置
一般为application/x-www-form-unlencoded ,这种类型的格式为:
**“名称=值”**的组合以&项链,其中,名称和值经过了百分号编码
关于百分号编码
中文和特殊字符不能直接用于URL,如果用在URL与要经过百分号编码,
百分号编码是将字符以字节为单位转换成%xx的形式。
例如本例中 账号为努力的shiki
在消息体中为user=%26%2321162%3B%26%2321147%3B%26%2330340%3Bshiki
这里已经解码成功了
multipart/form-data
那么当服务器使用multipart/form-data接收POST请求时,服务器怎么知道每个参数的开始位置和结束位置呢?
<form action="#" method="POST" enctype="multipart/form-data">
First name: <input type="text" name="name" value="努力的shiki"><br>
Last name: <input type="text" name="password" value="123456 "><br>
<input type="submit" value="提交">
</form>
我们开始抓包:
我们是可以看到
- Content-Type: multipart/form-data
- boundary=----WebKitFormBoundaryHS1waI401BVPLvvJ
和消息体中的
------WebKitFormBoundaryHS1waI401BVPLvvJ
Content-Disposition: form-data; name=“name”
努力的shiki
------WebKitFormBoundaryHS1waI401BVPLvvJ
Content-Disposition: form-data; name=“password”
123456
------WebKitFormBoundaryHS1waI401BVPLvvJ–
可以看出multipart/form-data不会对参数编码,使用的boundary(分割线),相当于&,boundary的值是----Web**AJv3。
我们来引用一张图来说明
文件上传时、要指定编码格式为multipart/form-data