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.