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.