Forår JSON-P med Jackson

REST Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN Jackson Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

Hvis du har udviklet noget på nettet, er du opmærksom på det den politiske begrænsning med samme oprindelse browsere har, når de behandler AJAX-anmodninger. Den enkle oversigt over begrænsningen er, at enhver anmodning, der stammer fra et andet domæne, skema eller port, ikke er tilladt.

En måde at slap af denne browserbegrænsning når du arbejder med JSON-data - er ved at bruge JSON med polstring (JSON-P).

Denne artikel diskuterer Spring's support til at arbejde med JSON-P-data - ved hjælp af AbstraktJsonpResponseBodyAdvice.

2. JSON-P i aktion

Den samme oprindelsespolitik er ikke pålagt over tag, så scripts kan indlæses på tværs af forskellige domæner. JSON-P-teknikken udnytter dette ved at videregive JSON-svaret som argumentet for javascript-funktionen.

2.1. Forberedelse

I vores eksempler bruger vi dette enkle Selskab klasse:

offentlig klasseselskab {privat lang id; privat strengnavn; // standard settere og getters} 

Denne klasse binder anmodningsparametrene og returneres fra serveren som JSON-repræsentation.

Controller-metoden er også en simpel implementering - returnering af Selskab eksempel:

@RestController offentlig klasse CompanyController {@RequestMapping (værdi = "/ companyRest", producerer = MediaType.APPLICATION_JSON_VALUE) offentlig virksomhed getCompanyRest () {Company virksomhed = nyt firma (1, "Xpto"); returvirksomhed; }}

På klientsiden kan vi bruge jQuery bibliotek til at oprette og sende en AJAX-anmodning:

$ .ajax ({url: '// localhost: 8080 / spring-mvc-java / companyRest', data: {format: 'json'}, type: 'GET', ...});

Overvej en AJAX-anmodning mod følgende URL:

// localhost: 8080 / spring-mvc-java / companyRest 

Svaret fra serveren ville være følgende:

{"id": 1, "name": "Xpto"}

Da anmodningen blev sendt mod det samme skema, domæne og port, bliver svaret ikke blokeret, og JSON-data tillades af browseren.

2.2. Anmodning om krydsoprindelse

Ved at ændre anmodnings-URL til:

//127.0.0.1:8080/spring-mvc-java/companyRest 

svaret blokeres af browseren på grund af anmodning, der sendes fra lokal vært til 127.0.0.1 som betragtes som et andet domæne og udgør en overtrædelse af samme oprindelsespolitik.

Med JSON-P er vi i stand til at tilføje en tilbagekaldsparameter til anmodningen:

//127.1.1.1:8080/spring-mvc-java/companyRest?callback=getCompanyData 

På klientsiden er det lige så let som at tilføje følgende parametre til AJAX-anmodningen:

$ .ajax ({... jsonpCallback: 'getCompanyData', dataType: 'jsonp', ...});

Det getCompanyData vil være den funktion, der kaldes, når svaret modtages.

Hvis serveren formaterer svaret som følger:

getCompanyData ({"id": 1, "name": "Xpto"}); 

browsere vil ikke blokere det, da det behandler svaret som et script, der er forhandlet og aftalt mellem klienten og serveren på grund af matchning getCompanyData i både anmodning og svar.

3. @ControllerAdvice Kommentar

Bønnerne kommenteret med @ControllerAdvice er i stand til at hjælpe alle eller en bestemt delmængde af controllere og bruges til at indkapsle tværgående adfærd, der deles mellem forskellige controllere. Typiske brugsmønstre er relateret til undtagelseshåndtering, tilføjelse af attributter til modeller eller registrering af bindemidler.

Startende med forår 4.1, @ControllerAdvice er i stand til at registrere implementeringerne af ResponseBodyAdvice interface, der tillader ændring af svaret, efter at det er returneret ved hjælp af en controller-metode, men før det skrives af en passende konverter.

4. Ændring af svaret ved hjælp af AbstraktJsonpResponseBodyAdvice

Begynder også med forår 4.1, har vi nu adgang til AbstraktJsonpResponseBodyAdvice klasse - som formaterer svaret i henhold til JSON-P-standarder.

Dette afsnit forklarer, hvordan man sætter basisklassen i spil og ændrer svaret uden at foretage ændringer i de eksisterende controllere.

For at aktivere Spring support til JSON-P, lad os starte med konfigurationen:

@ControllerAdvice offentlig klasse JsonpControllerAdvice udvider AbstractJsonpResponseBodyAdvice {public JsonpControllerAdvice () {super ("callback"); }} 

Støtten er lavet ved hjælp af AbstraktJsonpResponseBodyAdvice klasse. Den nøgle, der overføres til supermetoden, er den, der vil blive brugt i URL, der anmoder om JSON-P-data.

Med dette controller-rådgivning konverterer vi automatisk svaret til JSON-P.

5. JSON-P med forår i praksis

Med den tidligere diskuterede konfiguration på plads er vi i stand til at få vores REST-applikationer til at svare med JSON-P. I det følgende eksempel returnerer vi virksomhedsdata, så vores AJAX-anmodnings-URL skal være sådan noget:

//127.0.0.1:8080/spring-mvc-java/companyRest?callback=getCompanyData 

Som et resultat af den tidligere konfiguration ser svaret ud som følger:

getCompanyData ({"id": 1, "name": "Xpto"});

Som diskuteret bliver svaret i dette format ikke blokeret på trods af at det stammer fra et andet domæne.

Det JsonpControllerAdvice kan let anvendes på enhver metode, der returnerer et svar, der er kommenteret med @ResponseBody og SvarEnhed.

Der skal være en funktion med samme navn sendt i tilbagekaldet, getCompanyDatatil håndtering af alle svarene.

6. Konklusion

Denne hurtige artikel viser, hvordan et ellers kedeligt arbejde med formatering af svaret for at drage fordel af JSON-P forenkles ved hjælp af den nye funktionalitet i foråret 4.1.

Implementeringen af ​​eksemplerne og kodestykker findes i dette GitHub-projekt.

REST bunden

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN Jackson bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

$config[zx-auto] not found$config[zx-overlay] not found