美文网首页
Spring - @RequestBody vs @Respon

Spring - @RequestBody vs @Respon

作者: OldChicken_ | 来源:发表于2018-12-24 14:39 被阅读8次

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

相关文章

网友评论

      本文标题:Spring - @RequestBody vs @Respon

      本文链接:https://www.haomeiwen.com/subject/pufzkqtx.html