Annotations de corps et réponse

1. Introduction

Dans ce tutoriel rapide, nous fournissons un aperçu concis des annotations Spring @RequestBody et @ResponseBody .

2. @RequestBody

En termes simples, l' annotation @RequestBody mappe le corps HttpRequest à un objet de transfert ou de domaine, permettant la désérialisation automatique du corps HttpRequest entrant sur un objet Java.

Tout d'abord, jetons un coup d'œil à une méthode de contrôleur Spring:

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

Spring désérialise automatiquement le JSON en un type Java, en supposant qu'un type approprié soit spécifié.

Par défaut, le type que nous annotons avec l' annotation @RequestBody doit correspondre au JSON envoyé depuis notre contrôleur côté client:

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

Ici, l'objet que nous utilisons pour représenter le corps HttpRequest correspond à notre objet LoginForm .

Testons cela en utilisant CURL:

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

C'est tout ce dont nous avons besoin pour une API Spring REST et un client Angular utilisant l' annotation @ RequestBody .

3. @ResponseBody

L' annotation @ResponseBody indique à un contrôleur que l'objet retourné est automatiquement sérialisé dans JSON et renvoyé dans l' objet HttpResponse .

Supposons que nous ayons un objet Response personnalisé :

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

Ensuite, le contrôleur associé peut être implémenté:

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

Dans la console développeur de notre navigateur ou en utilisant un outil comme Postman, nous pouvons voir la réponse suivante:

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

N'oubliez pas que nous n'avons pas besoin d'annoter les contrôleurs annotés @ RestController avec l' annotation @ResponseBody puisque Spring le fait par défaut.

3.1. Définition du type de contenu

Lorsque nous utilisons l' annotation @ResponseBody , nous sommes toujours en mesure de définir explicitement le type de contenu renvoyé par notre méthode.

Pour cela, nous pouvons utiliser le @RequestMapping est produit attribut. Notez que les annotations telles que @PostMapping , @GetMapping , etc. définissent des alias pour ce paramètre.

Ajoutons maintenant un nouveau point de terminaison qui envoie une réponse JSON:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("JSON Content!"); }

Dans l'exemple, nous avons utilisé la constante MediaType.APPLICATION_JSON_VALUE . Alternativement, nous pouvons utiliser directement application / json .

Ensuite, implémentons une nouvelle méthode, mappée sur le même chemin / content , mais retournant du contenu XML à la place:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("XML Content!"); }

Maintenant, en fonction de la valeur d'un paramètre Accept envoyé dans l'en-tête de la requête, nous obtiendrons différentes réponses.

Voyons cela en action:

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

La commande CURL renvoie une réponse JSON:

HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:06 GMT {"text":"JSON Content!"}

Maintenant, modifions le paramètre Accept :

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

Comme prévu, nous obtenons un contenu XML cette fois:

HTTP/1.1 200 Content-Type: application/xml Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:19 GMT XML Content!

4. Conclusion

Nous avons créé un client Angular simple pour l'application Spring qui montre comment utiliser les annotations @RequestBody et @ResponseBody .

De plus, nous avons montré comment définir un type de contenu lors de l'utilisation de @ResponseBody .

Comme toujours, des exemples de code sont disponibles à l'adresse over sur GitHub.