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
结果: