JSON-parametere med fjær-MVC
1. Oversikt
I denne korte opplæringen skal vi se nærmere på hvordan vi kan jobbe med JSON-parametere i Spring MVC.
Først begynner vi med litt bakgrunn om JSON-parametere. Deretter går vi ned i kaninhullet for å se hvordan du sender JSON-parametere i POST- og GET-forespørsler.
2. JSON-parametere i vår-MVC
Å bruke JSON til å sende eller motta data er en vanlig praksis blant webutviklere. Den hierarkiske strukturen til JSON-strengene gir en mer kompakt og lesbar måte å representere parametere for HTTP-forespørsel på.
Som standard gir Spring MVC out-of-the-box databinding for enkle datatyper som String. For det formålet bruker den en liste over innebygde eiendomsredaktører under panseret.
Imidlertid kan det være lurt å binde mer komplekse datatyper i prosjekter fra den virkelige verden. For eksempel kan det være nyttig å kunne kartlegge en JSON-parameter i et modellobjekt.
3. Send JSON-data i POST
Spring gir en enkel måte å sende JSON-data via POST-forespørsler. Den innebygde @Fotball kommentar kan automatisk deserialisere JSON-dataene som er innkapslet i forespørselslegemet, til et bestemt modellobjekt.
Generelt trenger vi ikke å analysere anmodningsorganet selv. Vi kan bruke Jackson-biblioteket til å gjøre alle tunge løft for oss.
La oss nå se hvordan du sender JSON-data via en POST-forespørsel i Spring MVC.
For det første må vi lage et modellobjekt for å representere de passerte JSON-dataene. Tenk for eksempel på Produkt klasse:
offentlig klasse Produkt {privat int id; privat strengnavn; privat dobbel pris; // standardkonstruktør + getters + setters}
For det andre, la oss definere en Spring handler-metode som godtar POST-forespørsler:
@PostMapping ("/ create") @ResponseBody public Product createProduct (@RequestBody Product product) {// tilpasset logisk returprodukt; }
Som vi kan se, kommentere produkt argument med @Fotball er nok til å binde JSON-dataene som sendes fra klientene.
Nå kan vi teste vår POST-forespørsel ved hjelp av cURL:
krøll -i \ -H "Godta: applikasjon / json" \ -H "Innholdstype: applikasjon / json" \ -X POST --data \ '{"id": 1, "name": "Asus Zenbook", "pris": 800} '"// localhost: 8080 / spring-mvc-basics-4 / products / create"
4. Send JSON Parameter i GET
Våren MVC tilbyr @RequestParam for å trekke ut søkeparametere fra GET-forespørsler. Imidlertid, i motsetning til @RequestBody, de @RequestParam kommentar støtter bare enkle datatyper som int og String.
Så for å sende JSON, må vi definere JSON-parameteren vår som en enkel streng.
Det store spørsmålet her er: Hvordan konverterer vi JSON-parameteren vår (som er en String) til et objekt av Produkt klasse?
Svaret er ganske enkelt! De ObjectMapper klasse levert av Jackson-biblioteket tilbyr en fleksibel måte å konvertere JSON-strenger til Java-objekter.
La oss nå se hvordan du sender en JSON-parameter via en GET-forespørsel i Spring MVC. Først må vi lage en annen behandlingsmetode i kontrolleren vår for å håndtere GET-forespørsler:
@GetMapping ("/ get") @ResponseBody public Product getProduct (@RequestParam String product) kaster JsonMappingException, JsonProcessingException {Produkt prod = objectMapper.readValue (produkt, Product.class); retur prod; }
Som vist ovenfor, readValue () metoden tillater deserialisering av JSON-parameteren produkt direkte inn i en forekomst av Produkt klasse.
Merk at vi definerer vår JSON-søkeparameter som en String gjenstand. Nå, hva om vi vil passere en Produkt objekt som vi gjorde når vi brukte @Fotball?
For å svare på dette spørsmålet, tilbyr Spring en kortfattet og fleksibel løsning gjennom tilpassede eiendomsredaktører.
Først, vi må lage en egendefinert eiendomseditor for å innkapsle logikken for å konvertere JSON-parameteren gitt som en String til en Produkt gjenstand:
offentlig klasse ProductEditor utvider PropertyEditorSupport {private ObjectMapper objectMapper; public ProductEditor (ObjectMapper objectMapper) {this.objectMapper = objectMapper; } @ Override public void setAsText (String text) kaster IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } annet {Produkt prod = nytt produkt (); prøv {prod = objectMapper.readValue (tekst, Product.class); } catch (JsonProcessingException e) {throw new IllegalArgumentException (e); } setValue (prod); }}}
La oss deretter binde JSON-parameteren til et objekt fra Produkt klasse:
@GetMapping ("/ get2") @ResponseBody offentlig produkt get2Product (@RequestParam produktprodukt) {// tilpasset logisk returprodukt; }
Til slutt må vi legge til den siste manglende biten i puslespillet. La oss registrere ProductEditor i vår kontroller:
@InitBinder offentlig ugyldig initBinder (WebDataBinder bindemiddel) {binder.registerCustomEditor (Product.class, ny ProductEditor (objectMapper)); }
Husk det Vi må URL-kode JSON-parameteren for å sikre sikker transport.
Så i stedet for:
GET / spring-mvc-basics-4 / products / get2? Product = {"id": 1, "name": "Asus Zenbook", "price": 800}
Vi må sende:
GET / vår-mvc-grunnleggende-4 / produkter / get2? Produkt =% 7B% 22id% 22% 3A% 201% 2C% 22navn% 22% 3A% 20% 22Asus% 20 Zenbook% 22% 2C% 22 pris% 22% 3A % 20800% 7D
5. Konklusjon
For å oppsummere så vi hvordan vi kunne jobbe med JSON i Spring MVC. Underveis viste vi hvordan du sender JSON-parametere i POST- og GET-forespørsler.
Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.