@RequestBody En pocas palabras, la anotación @RequestBody asigna el cuerpo HttpRequest a un objeto de transferencia u objeto de dominio, lo que permite la deserialización automática del cuerpo HttpRequest entrante en un objeto Java.
Primero, echemos un vistazo a un método de controlador Spring:
@PostMapping("/request") public ResponseEntity postController( @RequestBody LoginForm loginForm) {
exampleService.fakeAuthenticate(loginForm);
return ResponseEntity.ok(HttpStatus.OK);
} Spring deserializa automáticamente el JSON en un tipo Java suponiendo que se especifica uno apropiado. De manera predeterminada, el tipo que anotamos con la anotación @RequestBody debe corresponderse con el JSON enviado desde nuestro controlador del lado del cliente:
public class LoginForm { private String username; private String password; // ... } Aquí, el objeto que utilizamos para representar el cuerpo HttpRequest se correlaciona con nuestro objeto LoginForm .
Probemos esto usando CURL:
1
2
3
4
curl -i
-H "Accept: application/json"
-H "Content-Type:application/json"
-X POST --data '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"
¡Esto es todo lo que se necesita para una API REST de Spring y un cliente angular que usa la anotación @ RequestBody !
Supongamos que tenemos un objeto de respuesta personalizado :
1 2 3 4 5 public class ResponseTransfer { private String text;
// standard getters/setters
} A continuación, el controlador asociado se puede implementar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Controller @RequestMapping("/post") public class ExamplePostController {
@Autowired
ExampleService exampleService;
@PostMapping("/response")
@ResponseBody
public ResponseTransfer postResponseController(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("Thanks For Posting!!!");
}
} En la consola de desarrollador de nuestro navegador o utilizando una herramienta como Cartero, podemos ver la siguiente respuesta:
1 {"text":"Thanks For Posting!!!"} Recuerde, no es necesario que anotemos los controladores anotados por @ RestController con la anotación @ResponseBody, ya que aquí se hace de forma predeterminada.