1. Introducción
En este tutorial rápido, proporcionamos una descripción concisa de las anotaciones Spring @RequestBody y @ResponseBody .
2. @RequestBody
En pocas palabras, la anotación @RequestBody asigna el cuerpo de HttpRequest a un objeto de transferencia o dominio, lo que permite la deserialización automática del cuerpo de 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 de Java, asumiendo que se especifica uno apropiado.
De forma predeterminada, el tipo que anotamos con la anotación @RequestBody debe corresponder al JSON enviado desde nuestro controlador del lado del cliente:
public class LoginForm { private String username; private String password; // ... }
Aquí, el objeto que usamos para representar los mapas corporales HttpRequest a nuestro objeto LoginForm .
Probemos esto usando CURL:
curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../request"
Esto es todo lo que necesitamos para una API REST de Spring y un cliente Angular usando la anotación @ RequestBody .
3. @ResponseBody
La anotación @ResponseBody le dice a un controlador que el objeto devuelto se serializa automáticamente en JSON y se devuelve al objeto HttpResponse .
Supongamos que tenemos un objeto Respuesta personalizado :
public class ResponseTransfer { private String text; // standard getters/setters }
A continuación, se puede implementar el controlador asociado:
@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 desarrollo de nuestro navegador o usando una herramienta como Postman, podemos ver la siguiente respuesta:
{"text":"Thanks For Posting!!!"}
Recuerde, no necesitamos anotar los controladores anotados en @ RestController con la anotación @ResponseBody ya que Spring lo hace por defecto.
3.1. Configuración del tipo de contenido
Cuando usamos la anotación @ResponseBody , todavía podemos establecer explícitamente el tipo de contenido que devuelve nuestro método.
Para ello, podemos utilizar el @RequestMapping 's produce atributo. Tenga en cuenta que anotaciones como @PostMapping , @GetMapping , etc. definen alias para ese parámetro.
Agreguemos ahora un nuevo punto final que envía una respuesta JSON:
@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("JSON Content!"); }
En el ejemplo, usamos la constante MediaType.APPLICATION_JSON_VALUE . Alternativamente, podemos usar application / json directamente.
A continuación, implementemos un nuevo método, asignado a la misma ruta / content , pero devolviendo contenido XML en su lugar:
@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("XML Content!"); }
Ahora, dependiendo del valor de un parámetro Accept enviado en el encabezado de la solicitud, obtendremos diferentes respuestas.
Veamos esto en acción:
curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"
El comando CURL devuelve una respuesta JSON:
HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:06 GMT {"text":"JSON Content!"}
Ahora, cambiemos el parámetro Aceptar :
curl -i \ -H "Accept: application/xml" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"
Como se anticipó, obtenemos un contenido XML esta vez:
HTTP/1.1 200 Content-Type: application/xml Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:19 GMT XML Content!
4. Conclusión
Hemos creado un cliente Angular simple para la aplicación Spring que demuestra cómo usar las anotaciones @RequestBody y @ResponseBody .
Además, mostramos cómo establecer un tipo de contenido al usar @ResponseBody .
Como siempre, los ejemplos de código están disponibles en GitHub.