Forårets RequestBody og ResponseBody-kommentarer

1. Introduktion

I denne hurtige vejledning giver vi et kort overblik over foråret @RequestBody og @ResponseBody kommentarer.

2. @RequestBody

Kort fortalt, det @RequestBody annotation kortlægger HttpForespørgsel krop til et overførsels- eller domæneobjekt, hvilket muliggør automatisk deserialisering af den indgående HttpForespørgsel krop på et Java-objekt.

Lad os først se på en Spring-controller-metode:

@PostMapping ("/ anmodning") offentlig ResponseEntity postController (@RequestBody LoginForm loginForm) {eksempelService.fakeAuthenticate (loginForm); returnere ResponseEntity.ok (HttpStatus.OK); }

Spring deserialiserer automatisk JSON til en Java-type, forudsat at der er angivet en passende.

Som standard, den type, vi kommenterer med @RequestBody annotering skal svare til JSON sendt fra vores klientsides controller:

offentlig klasse LoginForm {privat streng brugernavn; privat strengadgangskode; // ...}

Her er det objekt, vi bruger til at repræsentere HttpForespørgsel kropskort til vores LoginForm objekt.

Lad os teste dette ved hjælp af CURL:

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

Dette er alt, hvad vi har brug for til en Spring REST API og en kantet klient, der bruger @RequestBody kommentar.

3. @ResponseBody

Det @ResponseBody annotation fortæller en controller, at det returnerede objekt automatisk serieliseres til JSON og sendes tilbage til HttpResponse objekt.

Antag, at vi har en skik Respons objekt:

offentlig klasse ResponseTransfer {privat strengtekst; // standard getters / setters}

Dernæst kan den tilknyttede controller implementeres:

@Controller @RequestMapping ("/ post") offentlig klasse ExamplePostController {@Autowired ExampleService eksempelService; @PostMapping ("/ response") @ResponseBody public ResponseTransfer postResponseController (@RequestBody LoginForm loginForm) {returner nye ResponseTransfer ("Tak for indlægget !!!"); }}

I udviklerkonsollen i vores browser eller ved hjælp af et værktøj som Postman kan vi se følgende svar:

{"text": "Tak for indlægget !!!"}

Husk, vi behøver ikke at kommentere @ RestController-kommenterede controllere med @ResponseBody kommentar siden Spring gør det som standard.

3.1. Indstilling af indholdstype

Når vi bruger @ResponseBody kommentar, er vi stadig i stand til eksplicit at indstille den indholdstype, som vores metode returnerer.

For det, vi kan bruge @RequestMapping'S producerer attribut. Bemærk, at kommentarer kan lide @PostMapping, @GetMappingosv. definerer aliaser for denne parameter.

Lad os nu tilføje et nyt slutpunkt, der sender et JSON-svar:

@PostMapping (værdi = "/ indhold", producerer = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent (@RequestBody LoginForm loginForm) {returner nye ResponseTransfer ("JSON Content!"); }

I eksemplet brugte vi MediaType.APPLICATION_JSON_VALUE konstant. Alternativt kan vi bruge ansøgning / json direkte.

Lad os derefter implementere en ny metode, kortlagt til den samme /indhold sti, men returnerer XML-indhold i stedet:

@PostMapping (værdi = "/ indhold", producerer = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent (@RequestBody LoginForm loginForm) {returner ResponseTransfer ("XML Content!"); }

Nu, afhængigt af værdien af ​​et Acceptere parameter sendt i anmodningens overskrift, får vi forskellige svar.

Lad os se dette i aktion:

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

CURL-kommandoen returnerer et JSON-svar:

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

Lad os nu ændre Acceptere parameter:

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

Som forventet får vi et XML-indhold denne gang:

HTTP / 1.1 200 Indholdstype: applikation / xml Overførsel-kodning: klumpet dato: Thu, 20 Feb 2020 19:43:19 GMT XML-indhold!

4. Konklusion

Vi har bygget en simpel Angular-klient til Spring-appen, der demonstrerer, hvordan du bruger @RequestBody og @ResponseBody kommentarer.

Derudover viste vi, hvordan du indstiller en indholdstype, når du bruger @ResponseBody.

Som altid er kodeeksempler tilgængelige på GitHub.