Post请求的两种编码格式:application/x-www-form-urlencoded和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):

在这里插入图片描述
可以一一对应来学习:

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 ,这种类型的格式为:
    **“名称=值”**的组合以&项链,其中,名称和值经过了百分号编码

  • 关于MIME类型 可以异步我的另一篇博客:

  • MIME类型详解

关于百分号编码

中文和特殊字符不能直接用于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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐