@RequestBody 和 @ResponseBody 的使用场景
在 Spring MVC 或 Spring Boot 中,@RequestBody 和 @ResponseBody 是处理 HTTP 请求与响应体数据的核心注解,使用场景与 数据格式 和 交互方式 直接相关,具体如下:
一、@RequestBody:接收请求体数据
作用:将 HTTP 请求的 请求体(Request Body) 中的数据(通常是 JSON、XML 等格式)绑定到控制器方法的参数上。
适用场景:
-
客户端发送非表单格式的请求数据(如 JSON、XML)时:
例如前端通过axios.post(url, {name: "xxx", age: 18})发送 JSON 数据,后端需要用@RequestBody接收并转换为 Java 对象。@PostMapping("/user") public String addUser(@RequestBody User user) { // user 会自动接收请求体中的 JSON 数据并完成属性映射return "success"; } -
请求数据不在 URL 或表单参数中,而在请求体里:
常见于POST、PUT等 HTTP 方法(这些方法通常通过请求体传递数据),GET方法一般没有请求体,因此很少用@RequestBody。 -
需要接收复杂数据结构(如嵌套对象、数组)时:
表单参数(@RequestParam)适合简单键值对,而@RequestBody可直接绑定复杂 JSON 到 Java 实体类。
二、@ResponseBody:返回响应体数据
作用:将控制器方法的 返回值 直接写入 HTTP 响应体(Response Body),而非跳转页面(默认行为),通常会自动转换为 JSON/XML 等格式(由消息转换器处理)。
适用场景:
-
开发 RESTful API(返回数据而非页面):
例如接口需要返回 JSON 格式的用户信息、列表数据等,而非跳转 JSP/HTML 页面。@GetMapping("/user/{id}") @ResponseBody public User getUser(@PathVariable Long id) {User user = userService.findById(id);// 返回的 user 对象会自动转为 JSON 写入响应体return user; } -
前端需要异步获取数据(如 AJAX 请求)时:
前端通过 AJAX 调用接口后,需要直接接收数据(而非页面),此时用@ResponseBody返回数据。 -
控制器类使用
@RestController时可省略:
@RestController是@Controller+@ResponseBody的组合,类中所有方法默认都会加上@ResponseBody,无需单独声明。
总结:
@RequestBody:收数据,用在方法参数上,接收请求体中的 JSON/XML 等数据并绑定到对象。@ResponseBody:发数据,用在方法上(或通过@RestController简化),将返回值转为 JSON/XML 写入响应体。
两者通常配合使用,实现前后端通过 JSON 等格式进行数据交互(而非传统的表单提交+页面跳转)。
