Spring’s RequestBody and ResponseBody Annotations

1.简介

在这篇文章中,我们简要概述了Spring @RequestBody@ResponseBody注释。

2. @RequestBody

简而言之,@RequestBody注释将HttpRequest消息体映射到域对象,从而实现将HttpRequest消息自动反序列化到Java对象上。

首先,让我们看一下Spring控制器方法:

@PostMapping("/request")
public ResponseEntity postController(
  @RequestBody LoginForm loginForm) {
  
    exampleService.fakeAuthenticate(loginForm);
    return ResponseEntity.ok(HttpStatus.OK);
}
 

Spring会自动将JSON反序列化为Java类型,前提是指定了适当的JSON。

默认情况下,我们使用@RequestBody注解注释的对象类型必须与从客户端控制器发送的JSON相对应:

public class LoginForm {
    private String username;
    private String password;
    // ...
}

这里,我们用来表示HttpRequest消息体的json内容映射到我们的LoginForm对象。

让我们用CURL测试一下:

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data 
  '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"
 

这就是使用@RequestBody注释的Spring REST API客户端所需的全部内容

3. @ResponseBody

@ResponseBody注解告诉控制器返回的对象将自动序列化为JSON,并直接返回给HttpResponse对象(而不经过视图层渲染)。

假设我们有一个自定义的Response对象:

public class ResponseTransfer {
    private String text; 
     
    // standard getters/setters
}
 

接下来,可以实现相关的控制器:

@Controller
@RequestMapping("/post")
public class ExamplePostController {
 
    @Autowired
    ExampleService exampleService;
 
    @PostMapping("/response")
    @ResponseBody
    public ResponseTransfer postResponseController(
      @RequestBody LoginForm loginForm) {
        return new ResponseTransfer("Thanks For Posting!!!");
     }
}
 

在浏览器中或使用像Postman这样的工具,我们可以看到以下响应:

{"text":"Thanks For Posting!!!"}
 

请记住,注解了@RestController-的控制器不需要注解@ResponseBody,因为@RestController默认指定就是讲json和对象之间进行序列化和反序列化,就是默认包含 @RequestBody @ResponseBody

4.结论

我们为Spring应用程序构建了一个简单的\客户端,演示了如何使用@RestController@ResponseBody注解

posted @ 2019-04-02 22:09  exact  阅读(138)  评论(0编辑  收藏  举报