Spring Boot REST API接收Postman JSON返回HTTP 415错误的原因与疑问
我正在学习Spring Boot中REST API的工作机制,在向控制器端点发送JSON数据时遇到问题:API返回HTTP 415 Unsupported Media Type错误,尽管JSON本身格式有效。
控制器代码
@RestController @RequestMapping("/users") public class UserController { @PostMapping public String createUser(@RequestBody User user) { return "User created"; } }
模型代码
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Postman请求信息
发送的JSON内容
{ "name": "Jeferson", "age": 20 }
请求配置
- 请求方法:POST
- URL:http://localhost:8080/users
- Body类型:raw
- 选择格式:JSON
我已检查端点URL、HTTP请求方法、JSON格式、模型字段及getter/setter方法,也查阅了HTTP 415相关文档,但仍未理解Spring Boot拒绝请求的原因。后来发现请求失败时,Postman实际发送的请求头为Content-Type: text/plain,而非预期的Content-Type: application/json。
我的疑问
- 为何JSON有效,Spring Boot仍拒绝请求?
@RequestBody正常工作是否必须依赖Content-Type请求头?- Spring Boot如何判断请求支持的媒体类型?
1. 为何JSON有效,Spring Boot仍拒绝请求?
Spring Boot处理请求体时,核心依据是请求头的Content-Type,而非仅看请求体的格式。你这里虽然JSON结构正确,但请求头标记的是text/plain,服务器会把请求体当成普通纯文本处理,无法触发JSON到Java对象的反序列化逻辑,因此返回415不支持的媒体类型错误。
2. @RequestBody正常工作是否必须依赖Content-Type请求头?
是的。@RequestBody的作用是让Spring把请求体转换为指定Java对象,这个转换由**消息转换器(MessageConverter)**完成。而消息转换器是通过Content-Type来匹配的——比如处理JSON的MappingJackson2HttpMessageConverter只识别application/json类型的请求。如果请求头没有正确的Content-Type,Spring找不到对应的转换器,就无法完成对象转换,直接抛出415错误。
3. Spring Boot如何判断请求支持的媒体类型?
Spring Boot主要通过两个层面判断:
- 请求头的
Content-Type:这是最直接的标识,告诉服务器请求体的数据格式,比如application/json、application/x-www-form-urlencoded等。 - 控制器方法的限定配置:比如在
@PostMapping中添加consumes = "application/json",就直接限定该端点只接受JSON类型的请求;@RequestBody注解也会触发Spring检查请求的Content-Type是否有匹配的消息转换器。
另外,Spring Boot默认已经内置了常用的消息转换器,比如处理JSON的Jackson转换器、处理表单数据的表单转换器等。当请求的Content-Type不在这些转换器的支持范围内,或者没有找到匹配的转换器时,就会返回415错误。
内容的提问来源于stack exchange,提问作者J_oslee19

