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):

postgrel 支持并发数量 post支持多种编码_html


可以一一对应来学习:

postgrel 支持并发数量 post支持多种编码_postgrel 支持并发数量_02

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

postgrel 支持并发数量 post支持多种编码_html_03


这里已经解码成功了

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>

我们开始抓包:

postgrel 支持并发数量 post支持多种编码_post_04

我们是可以看到

  • 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。

我们来引用一张图来说明

postgrel 支持并发数量 post支持多种编码_html_05

文件上传时、要指定编码格式为multipart/form-data