415错误本质是前后端Content-Type未达成共识:Postman选form-data时自动设multipart/form-data,但后端@RequestBody只认application/json,导致不匹配;必须确保Body模式与后端注解严格对应——JSON用raw+@RequestBody,表单用urlencoded或form-data+@RequestParam/@RequestPart。

Postman里选了form-data却返回415
这说明后端根本没打算处理 multipart/form-data,你提交的“表单”在它眼里是非法格式。Postman的 form-data 模式会自动设置 Content-Type: multipart/form-data; boundary=...,但很多后端接口(尤其是用 @RequestBody 注解的 Spring Boot 接口)只认 application/json,压根不解析 multipart。
常见错误现象:{"status":415,"error":"Unsupported Media Type","message":"Content type 'multipart/form-data;charset=utf-8' not supported"}
- 先确认接口文档或后端代码:是否明确要求
multipart/form-data?还是其实只要 JSON? - 如果后端 Controller 方法参数用了
@RequestBody,那它只收 JSON,必须切到raw → JSON模式,不能用form-data - 如果后端用的是
@RequestParam或@RequestPart,才可能支持form-data;此时还要检查字段名是否和后端@RequestPart("file")中的字符串完全一致
Content-Type头被Postman“悄悄覆盖”了
即使你在 Headers 里手动加了 Content-Type: application/json,只要 Body 模式选的是 form-data 或 urlencoded,Postman 就会忽略你填的,强制覆盖成对应类型——这是它的设计逻辑,不是 bug。
验证方法:点开 Postman 右上角「Code」→「cURL (bash)」,看生成的命令里 -H "Content-Type: ..." 是什么。如果和你手动填的不一致,说明被覆盖了。
- 解决办法只有一条:Body 模式和 Content-Type 必须严格匹配——选
raw才能自由控制Content-Type头 -
form-data模式下,Header 里的Content-Type字段会被禁用(灰显),改了也无效 - 某些旧版 Postman 插件(如 Tabbed Postman)甚至不会自动补
application/json,必须手动加
后端接收逻辑和前端格式彻底错位
最典型的错位是:前端发的是 application/x-www-form-urlencoded(比如 Postman 选了 urlencoded 模式),后端却用 @RequestBody 去接——Spring Boot 默认不支持这种组合,直接 415。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
错误日志常含:"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported"
- 要么前端改:切到
raw → JSON,并确保 Header 有Content-Type: application/json - 要么后端改:把
@RequestBody换成@RequestParam,同时接受键值对(但要注意 DTO 字段映射、嵌套对象无法自动绑定) - 注意:Spring Boot 的
@RequestBody和@RequestParam是互斥接收路径,不能混用在同一参数上
文件+文本混合提交时boundary失效
当你要传一个文件 + 几个 JSON 结构的文本字段(比如 {"meta":{"type":"image"}} ),别试图在 form-data 里把 JSON 当 text 字段塞进去——后端收到的是字符串,不是解析后的对象,@RequestBody 根本不触发。
真正可行的方案只有两种:
- 全走
multipart/form-data:文件用 file 类型字段,JSON 数据拆成多个 text 字段(如meta_type=image),后端用@RequestPart分别接收 - 文件 base64 编码后塞进 JSON:整个请求走
raw → JSON,字段如{"file_data":"base64...", "meta":{"type":"image"}},后端用@RequestBody接收再解码 - 别在
form-data里混用 raw JSON 字段——Postman 不支持,RFC 也不允许
415 的本质不是格式错了,而是前后端对“这次对话该用哪种语言”根本没达成共识。最容易被忽略的点是:你以为你在控制 Content-Type,其实 Postman 的 Body 模式早就替你决定了;你以为后端能智能识别,其实它只按注解字面意思硬匹配。多看一眼 cURL 输出,比反复重试快得多。










