Spring's RequestBody y ResponseBody anotaciones

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.