为什么我的Spring Boot REST API在用Postman发送JSON时会返回415不支持的媒体类型?

后端开发 2026-07-09

我在学习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中,有一些类,如 DispatcherServletHttpMessageConverter,负责将用户请求路由到正确的控制器,并将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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章