为什么我的Spring Boot REST API在用Postman发送JSON时会返回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
}
在Postman的请求配置:
- 方法:
POST - URL:
http://localhost:8080/users - 请求体类型:
raw - 选择的格式:
JSON
我已经检查了:
- 端点URL
- HTTP方法
- JSON格式
- 模型字段和getter/setters
我还查阅了与不支持的媒体类型相关的HTTP 415文档,但我仍然不完全理解为什么在这种情况下Spring Boot会拒绝请求体。
我注意到请求失败时,Postman会发送以下头信息:
Content-Type: text/plain
而不是:
Content-Type: application/json
我的问题是:
- 为什么当JSON请求体本身有效时,Spring Boot仍然拒绝该请求?
Content-Type头是否是让@RequestBody正确工作所必需的?- Spring Boot如何确定一个请求支持哪些媒体类型?
解决方案
在Postman中,设置请求体的位置有一个下拉列表,用来定义请求体中数据的类型,请确保将其设置为JSON(正如你在图片中看到的那样)。
在Spring Boot中,有一些类,如 DispatcherServlet 和 HttpMessageConverter,负责将用户请求路由到正确的控制器,并将HTTP请求转换为相应的Java对象。你所遇到的错误与这些类相关,它们遵循标准的HTTP协议实现,因此尽管你的HTTP请求包含正确的JSON数据,但它们无法正确地进行转换。
在Spring Boot中,你也可以为你的端点定义特定的媒体类型。例如,在下面的伪代码中,我为端点定义了 application/json:
@PostMapping(value = "/users", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public String createUser(@RequestBody User user) { ... }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
