【Spring】Spring 注解解码:@RequestBody 与 @ResponseBody 的双向桥梁艺术

发布于:2025-04-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

1.介绍@RequestBody和@ResponseBody

@RequestBody此注解一般用于将 HTTP 请求体中的内容转换为 Java 对象。通常在处理 ==POST、PUT ==这类请求时,客户端会把数据放在请求体里,使用@RequestBody就能把请求体中的数据映射到对应的 Java 对象上。

@ResponseBody该注解的作用是把控制器方法返回的 Java 对象转换为 HTTP 响应体(简单的来说直接返回的是数据)。一般来说,Spring MVC 会把返回值解析成视图名称,再用视图解析器找到对应的视图来渲染响应。但使用@ResponseBody后,会直接把返回的 Java 对象通过消息转换器转换为指定格式(如 JSON、XML),并作为响应体返回给客户端。

2.使用场景

注解 使用场景
@RequestBody 接收客户端发送的复杂数据(如 POST/PUT 请求的 JSON 格式参数)。
@ResponseBody 向客户端返回复杂数据(如 RESTful API 的 JSON 响应,避免视图解析)。

3.示例

3.1@RequestBody注解

3.1.1 传Json数据

创建一个User对象:

public class User {

    private String name;

    private Integer age;
    
    private String Sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return Sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

	@Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

采用Post/put请求传递Json数据:

@RestController
@RequestMapping("/path")
public class testControler {

    @RequestMapping("/r")
    public String request(@RequestBody User user){

        return "name:" + user.getName()+" age:"+user.getAge()+" 性别:"+user.getSex();
    }

注意:在浏览器中不能采用使用post方式请求:
127.0.0.1:8080/path/r?name=liming&age=20&sex=man
在这里插入图片描述
原因:请求方式不匹配,@RequestBody注解一般用于处理 POST、PUT 这类带有请求体的请求,浏览器搜索路径用的是 GET 请求,GET 请求通常没有请求体,使用 @RequestBody 注解就会出错。因为 @RequestBody 注解需要从请求体里获取数据。

3.1.2 通过URL参数来传递数据不需要使用@RequestBody

通过URL参数来传递数据不需要使用@RequestBody
后端代码:

    @RequestMapping("/r2")
    public String r2(User user){

        return "name:" + user.getName()+" age:"+user.getAge()+" 性别:"+user.getSex();
    }

运行后,使用浏览器搜素:127.0.0.1:8080/path/r2?name=liming&age=20&sex=man
在这里插入图片描述

Spring 会尝试从请求的参数里获取数据并绑定到 User 对象的属性上。这意味着可以通过 URL 参数(如 ?name=liming&age=20)来传递数据,Spring 会自动把这些参数映射到 User 对象的对应属性上。

3.2@ResponseBody

3.2.1@responseBody注解配合@Controller注解

@ResponseBody 注解的核心作用是告知 Spring 框架,把控制器方法的返回值直接序列化为 JSON、XML 或者其他媒体类型,并写入 HTTP 响应体。这样一来,客户端收到的响应就是方法返回的具体数据,而非视图页面

代码演示:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/basic")
@Controller
public class BasicController {

    @RequestMapping("/say")
    @ResponseBody
    public String Hello() {
        return "Hello!";
    }
}

运行程序后再浏览器搜索127.0.01:8080/basic/say
结果:
在这里插入图片描述

3.2.2@RestController=@responseBody+@Controller

@RestController:这是 @Controller 和 @ResponseBody 的组合注解,表明该类是一个控制器,并且类中的所有方法返回值都会直接写入响应体

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// @RestController 是 @Controller 和 @ResponseBody 的组合注解
@RestController
@RequestMapping("/test")
public class MyController {
    
    // 该方法返回一个字符串,会直接作为响应体返回给客户端
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }
}

运行程序后再浏览器搜索127.0.01:8080/test/hello
结果:
在这里插入图片描述