De annotaties RequestBody en ResponseBody van Spring
1. Inleiding
In deze korte tutorial geven we een beknopt overzicht van de lente @RequestBody en @ResponseBody annotaties.
2. @RequestBody
Simpel gezegd, de @RequestBody annotatie wijst de HttpRequest body naar een transfer- of domeinobject, waardoor automatische deserialisatie mogelijk is van de inkomende HttpRequest body naar een Java-object.
Laten we eerst eens kijken naar een Spring-controller-methode:
@PostMapping ("/ request") openbare ResponseEntity postController (@RequestBody LoginForm loginForm) {exampleService.fakeAuthenticate (loginForm); return ResponseEntity.ok (HttpStatus.OK); }
Spring deserialiseert automatisch de JSON naar een Java-type, ervan uitgaande dat een geschikt is gespecificeerd.
Standaard, het type dat we annoteren met de @RequestBody annotatie moet overeenkomen met de JSON die is verzonden vanaf onze client-side controller:
openbare klasse LoginForm {private String gebruikersnaam; privé String-wachtwoord; // ...}
Hier is het object dat we gebruiken om de HttpRequest lichaamskaarten naar onze Login formulier voorwerp.
Laten we dit testen met CURL:
curl -i \ -H "Accept: application / json" \ -H "Content-Type: application / json" \ -X POST --data '{"gebruikersnaam": "johnny", "wachtwoord": "wachtwoord"} '"//localhost:8080/.../request"
Dit is alles wat we nodig hebben voor een Spring REST API en een Angular-client die de @RequestBody annotatie.
3. @ResponseBody
De @ResponseBody annotatie vertelt een controller dat het geretourneerde object automatisch wordt geserialiseerd in JSON en wordt teruggestuurd naar het HttpResponse voorwerp.
Stel dat we een gewoonte hebben Reactie voorwerp:
openbare klasse ResponseTransfer {privé String-tekst; // standaard getters / setters}
Vervolgens kan de bijbehorende controller worden geïmplementeerd:
@Controller @RequestMapping ("/ post") openbare klasse ExamplePostController {@Autowired ExampleService exampleService; @PostMapping ("/ response") @ResponseBody openbare ResponseTransfer postResponseController (@RequestBody LoginForm loginForm) {retourneer nieuwe ResponseTransfer ("Bedankt voor het plaatsen !!!"); }}
In de ontwikkelaarsconsole van onze browser of met behulp van een tool zoals Postman, kunnen we het volgende antwoord zien:
{"text": "Bedankt voor het plaatsen !!!"}
Onthoud dat we de @ RestController-geannoteerde controllers met de @ResponseBody annotatie sinds Spring doet het standaard.
3.1. Het inhoudstype instellen
Wanneer we de @ResponseBody annotatie, kunnen we nog steeds expliciet het inhoudstype instellen dat onze methode retourneert.
Daarom, we kunnen de @RequestMapping‘S produceert attribuut. Merk op dat annotaties zoals @PostMapping, @GetMapping, etc. definiëren aliassen voor die parameter.
Laten we nu een nieuw eindpunt toevoegen dat een JSON-antwoord verzendt:
@PostMapping (waarde = "/ content", produceert = MediaType.APPLICATION_JSON_VALUE) @ResponseBody openbare ResponseTransfer postResponseJsonContent (@RequestBody LoginForm loginForm) {retourneer nieuwe ResponseTransfer ("JSON Content!"); }
In het voorbeeld hebben we de MediaType.APPLICATION_JSON_VALUE constante. Als alternatief kunnen we gebruiken applicatie / json direct.
Laten we vervolgens een nieuwe methode implementeren, die aan dezelfde is toegewezen /inhoud pad, maar in plaats daarvan XML-inhoud retourneren:
@PostMapping (waarde = "/ content", produceert = MediaType.APPLICATION_XML_VALUE) @ResponseBody openbare ResponseTransfer postResponseXmlContent (@RequestBody LoginForm loginForm) {retourneer nieuwe ResponseTransfer ("XML Content!"); }
Nu, afhankelijk van de waarde van een Aanvaarden parameter verzonden in de header van het verzoek, krijgen we verschillende antwoorden.
Laten we dit in actie zien:
curl -i \ -H "Accept: application / json" \ -H "Content-Type: application / json" \ -X POST --data '{"gebruikersnaam": "johnny", "wachtwoord": "wachtwoord"} '"//localhost:8080/.../content"
De CURL-opdracht retourneert een JSON-antwoord:
HTTP / 1.1 200 Content-Type: application / json Transfer-Encoding: chunked Datum: do, 20 feb 2020 19:43:06 GMT {"text": "JSON Content!"}
Laten we nu de Aanvaarden parameter:
curl -i \ -H "Accept: application / xml" \ -H "Content-Type: application / json" \ -X POST --data '{"gebruikersnaam": "johnny", "wachtwoord": "wachtwoord"} '"//localhost:8080/.../content"
Zoals verwacht, krijgen we deze keer een XML-inhoud:
HTTP / 1.1 200 Inhoudstype: application / xml Overdrachtcodering: chunked Datum: do, 20 feb 2020 19:43:19 GMT XML-inhoud!
4. Conclusie
We hebben een eenvoudige Angular-client gebouwd voor de Spring-app die laat zien hoe je de @RequestBody en @ResponseBody annotaties.
Bovendien hebben we laten zien hoe u een inhoudstype instelt bij het gebruik van @ResponseBody.
Zoals altijd zijn codevoorbeelden beschikbaar op GitHub.