Content-Type与Body模式不匹配是400/415错误主因;x-www-form-urlencoded适用于后端明确要求URL编码键值对的传统表单接口,如登录注册,其请求体为key=value&key2=value2扁平字符串,Postman自动设置Content-Type且不支持文件上传。

Postman 里选错表单格式,90% 的 400 或 415 Unsupported Media Type 错误就来自这里——不是后端写错了,是 Content-Type 和 Body 模式没对上。
什么时候必须用 x-www-form-urlencoded
后端明确要求接收 URL 编码的键值对,比如登录、注册、搜索这类传统 Web 表单接口。典型特征是:Content-Type: application/x-www-form-urlencoded,且参数结构简单(无嵌套、无数组、无布尔/空值)。
- 请求体是
key1=value1&key2=value2这种扁平字符串,不是 JSON - Postman 会自动把空格转成
+,特殊字符做百分号编码(如name=张三→name=%E5%BC%A0%E4%B8%89) - 不支持直接传文件;如果看到接口文档写“表单提交”,但又要求上传头像,那大概率其实是
form-data,不是这个 - Headers 里别手动加
Content-Type—— Postman 选了x-www-form-urlencoded就会自动设好,重复设置反而可能出问题
form-data 和 x-www-form-urlencoded 到底怎么分
关键看有没有文件,或者要不要发多类型字段。两者都叫“表单”,但协议底层完全不同。
-
form-data对应multipart/form-data,天生支持混合:文本字段 + 文件(比如avatar字段传一张 PNG,username字段传字符串) -
x-www-form-urlencoded只能传纯文本键值对,连 base64 字符串都算“文本”,但不能带二进制边界(boundary) - 如果接口文档没写清楚,抓包看浏览器实际发的请求:有
boundary=----WebKitFormBoundary就是form-data;只有Content-Type: application/x-www-form-urlencoded且 body 是a=1&b=2风格,就是后者 - Postman 里选
form-data后,每行 Key-Value 下方会出现“Text”或“File”下拉开关——这是唯一能选“File”的地方;x-www-form-urlencoded根本没有这个选项
为什么选了 x-www-form-urlencoded 还报 400
常见不是格式选错,而是参数填法不对。Postman 的 x-www-form-urlencoded 界面看着像表格,但行为和 raw 完全不同。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- Key 和 Value 栏里**不能写 JSON 字符串**,比如
data字段值填{"id":1}—— 这会被当纯文本编码成data=%7B%22id%22%3A1%7D,后端收到的是字符串,不是对象 - 空值要留空,别填
null或"",否则会被当成字符串字面量 - 中文、emoji、斜杠等必须让 Postman 自动编码,别自己先 URL encode 再粘贴进去(会导致双重编码)
- 如果后端用 Spring Boot,且参数用
@RequestParam接收,那必须用x-www-form-urlencoded;若用@RequestBody,那就得切到raw → JSON,跟表单格式无关
Headers 里要不要手动设 Content-Type
绝大多数情况——不要。Postman 在你切换 Body 模式时已经帮你设好了,手动覆盖反而容易出错。
- 选
x-www-form-urlencoded:Postman 自动加Content-Type: application/x-www-form-urlencoded,无额外参数 - 选
form-data:自动加Content-Type: multipart/form-data; boundary=----WebKitFormBoundary...,boundary 是动态生成的,别手改 - 只有当你需要覆盖 charset(比如强制
utf-8)或加自定义参数时才手动干预,例如:Content-Type: application/x-www-form-urlencoded; charset=utf-8—— 但多数现代后端默认 utf-8,这步常冗余 - 如果 Headers 里已有一条
Content-Type,而你又切了 Body 模式,Postman 不会自动删旧的,得自己检查删掉,否则两条冲突
真正容易被忽略的点是:Postman 的 x-www-form-urlencoded 模式下,所有字段值都会被强制 URL 编码,哪怕你只输数字或英文。如果你在调试一个对编码敏感的旧系统(比如某些银行接口),得确认它是否接受编码后的值,还是要求原始字节流——这时候就得切 raw 手写编码后的字符串,而不是依赖界面模式。










