1. 简介
@RequestBody 和 @ResponseBody 是Spring的常用注解。应用之间的通信经常会使用http协议,发出http request,或者接收http response,而应用程序的对象用JavaObject来表示,@RequestBody和@ResponseBody就是用于http对象和Java对象之间的转化的工具:
http request --@RequestBody deserialize--> JavaObject
JavaObject --@ResponseBody serialize--> http response
使用这两个注解编写web应用,使用者可以专注于Java编码,而不用管HTTP相关内容。
2. 使用方法
2.1 @RequestBody 使用方法
@RequestBody 是将 HttpRequest 中的JSON内容转化成应用能处理的Java对象:
@PostMapping("/request")
public ResponseEntity postController(@RequestBody LoginForm loginForm) {
exampleService.fakeAuthenticate(loginForm);
return ResponseEntity.ok(HttpStatus.OK);
}
需要注意的是,JSON对象和Java对象的内容必须是对应的:
public class LoginForm {
private String username;
private String password;
}
curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data
'{"username": "johnny", "password": "password"}' "[https://localhost:8080/.../request](https://localhost:8080/.../request)"
2.2 @ResponseBody 使用方法
与 @RequestBody 相对应,@ResponseBody 是将应用处理后返回的Java对象转化成JSON,然后传到HttpResponse中。
@Controller
@RequestMapping("/post")
public class ExamplePostController {
@Autowired
ExampleService exampleService;
@PostMapping("/response")
@ResponseBody
public ResponseTransfer postResponseController(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("Thanks For Posting!!!");
}
}
public class ResponseTransfer {
private String text;
// standard getters/setters
}
在响应请求后,可以在浏览器中看到JSON字符串
{"text":"Thanks For Posting!!!"}
3. 原理
Spring MVC对请求的处理过程如下图所示:
HttpRequest2HttpResponse
如果检测到 @RequestBody 注解,RequestResponseBodyMethodProcessor 会用 resolveArgument 方法来处理HttpRequest(该方法是由于实现了 HandlerMethodReturnValueHandler 类而获得),将其转化称 HttpInputMessage,之后 HttpMessageConverter 将其转化称 Java Object 供 Spring MVC 处理,返回响应的过程同理。
如果传入的 HttpRequest 格式不匹配,HTTPMessageConverter 会报错:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=--------------------------645031268342269105702519;charset=UTF-8' not supported
相关文章:
Spring - @PathVariable、@RequestParam 、@RequestBody的使用
Spring MVC中@Controller 和@RestController 注解的区别
SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
网友评论