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注解。