Vår JSON-P med Jackson
Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:
>> KONTROLLER KURSET Jackson TopJeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:
>> KONTROLLER KURSET1. Oversikt
Hvis du har utviklet noe på nettet, er du klar over det samme begrensning for politikk nettlesere har når de håndterer AJAX-forespørsler. Den enkle oversikten over begrensningen er at enhver forespørsel som kommer fra et annet domene, skjema eller port, ikke er tillatt.
En måte å slapp av denne nettleserbegrensningen når du arbeider med JSON-data - er ved å bruke JSON med polstring (JSON-P).
Denne artikkelen diskuterer vårs støtte til å jobbe med JSON-P-data - ved hjelp av SammendragJsonpResponseBodyAdvice.
2. JSON-P i aksjon
Politikken med samme opprinnelse er ikke pålagt over tag, slik at skript kan lastes inn på forskjellige domener. JSON-P-teknikken utnytter dette ved å sende JSON-responsen som argumentet for javascript-funksjonen.
2.1. Forberedelse
I eksemplene våre vil vi bruke dette enkle Selskap klasse:
offentlig klasse Company {privat lang id; privat strengnavn; // standard setters og getters}
Denne klassen vil binde forespørselsparametrene og skal returneres fra serveren som JSON-representasjon.
Controller-metoden er også en enkel implementering - å returnere Selskap forekomst:
@RestController offentlig klasse CompanyController {@RequestMapping (verdi = "/ companyRest", produserer = MediaType.APPLICATION_JSON_VALUE) offentlig selskap getCompanyRest () {Company selskap = nytt selskap (1, "Xpto"); retur selskap; }}
På klientsiden kan vi bruke jQuery bibliotek for å opprette og sende en AJAX-forespørsel:
$ .ajax ({url: '// localhost: 8080 / spring-mvc-java / companyRest', data: {format: 'json'}, type: 'GET', ...});
Vurder en AJAX-forespørsel mot følgende URL:
// localhost: 8080 / spring-mvc-java / companyRest
Svaret fra serveren vil være følgende:
{"id": 1, "name": "Xpto"}
Siden forespørselen ble sendt mot samme skjema, domene og port, blir ikke svaret blokkert, og JSON-data blir tillatt av nettleseren.
2.2. Kryssopprinnelsesforespørsel
Ved å endre forespørsel-URL til:
//127.0.0.1:8080/spring-mvc-java/companyRest
svaret blir blokkert av nettleseren på grunn av forespørsel sendt fra lokal vert til 127.0.0.1 som betraktes som et annet domene og utgjør et brudd på policyen med samme opprinnelse.
Med JSON-P kan vi legge til en tilbakeringingsparameter i forespørselen:
//127.1.1.1:8080/spring-mvc-java/companyRest?callback=getCompanyData
På klientsiden er det like enkelt som å legge til følgende parametere i AJAX-forespørselen:
$ .ajax ({... jsonpCallback: 'getCompanyData', dataType: 'jsonp', ...});
De getCompanyData vil være funksjonen som kalles når svaret mottas.
Hvis serveren formaterer svaret slik:
getCompanyData ({"id": 1, "name": "Xpto"});
nettlesere vil ikke blokkere det, da det vil behandle svaret som et skript som er forhandlet og avtalt mellom klienten og serveren på grunn av samsvar getCompanyData i både forespørsel og svaret.
3. @ControllerAdvice Kommentar
Bønnene kommentert med @ControllerAdvice er i stand til å hjelpe alle eller et bestemt delsett av kontrollere og brukes til å kapsle inn tverrgående oppførsel som deles mellom forskjellige kontrollere. Typiske bruksmønstre er relatert til unntakshåndtering, legge til attributter til modeller eller registrere permer.
Fra og med våren 4.1, @ControllerAdvice er i stand til å registrere implementeringene av ResponseBodyAdvice grensesnitt som gjør det mulig å endre responsen etter at den er returnert av en kontrollermetode, men før den skrives av en passende omformer.
4. Endre responsen ved hjelp av SammendragJsonpResponseBodyAdvice
Begynner også med våren 4.1, har vi nå tilgang til SammendragJsonpResponseBodyAdvice klasse - som formaterer svaret i henhold til JSON-P-standarder.
Denne delen forklarer hvordan du kan spille basisklassen og endre responsen uten å gjøre noen endringer i de eksisterende kontrollerne.
For å aktivere vårstøtte for JSON-P, la oss starte med konfigurasjonen:
@ControllerAdvice offentlig klasse JsonpControllerAdvice utvider AbstractJsonpResponseBodyAdvice {public JsonpControllerAdvice () {super ("callback"); }}
Støtten er laget ved hjelp av SammendragJsonpResponseBodyAdvice klasse. Nøkkelen som sendes videre til supermetoden er den som skal brukes i URL som ber om JSON-P-data.
Med dette kontrollerrådet konverterer vi automatisk svaret til JSON-P.
5. JSON-P med vår i praksis
Med den tidligere diskuterte konfigurasjonen på plass, er vi i stand til å få våre REST-applikasjoner til å svare med JSON-P. I det følgende eksemplet vil vi returnere selskapets data, så AJAX-forespørsels-URL-adressen vår bør være omtrent slik:
//127.0.0.1:8080/spring-mvc-java/companyRest?callback=getCompanyData
Som et resultat av den forrige konfigurasjonen, vil svaret se slik ut:
getCompanyData ({"id": 1, "name": "Xpto"});
Som diskutert, vil ikke svaret i dette formatet bli blokkert til tross for at det kommer fra et annet domene.
De JsonpControllerAdvice kan enkelt brukes på hvilken som helst metode som returnerer et svar kommentert med @ResponseBody og ResponseEntity.
Det skal være en funksjon med samme navn sendt i tilbakeringingen, getCompanyData, for å håndtere alle svarene.
6. Konklusjon
Denne raske artikkelen viser hvordan et ellers kjedelig arbeid med å formatere responsen for å dra nytte av JSON-P er forenklet ved hjelp av den nye funksjonaliteten våren 4.1.
Implementeringen av eksemplene og kodebiter finner du i dette GitHub-prosjektet.
HVILLE bunnen