Spring JSON-P met Jackson

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS Jackson Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

Als u iets op internet heeft ontwikkeld, weet u dat dezelfde beleidsbeperking browsers hebben bij het omgaan met AJAX-verzoeken. Het simpele overzicht van de beperking is dat elk verzoek dat afkomstig is van een ander domein, schema of poort, niet zal worden toegestaan.

Een weg tot versla deze browserbeperking bij het werken met JSON-gegevens - is door JSON te gebruiken met opvulling (JSON-P).

Dit artikel bespreekt de ondersteuning van Spring voor het werken met JSON-P-gegevens - met behulp van SamenvattingJsonpResponseBodyAdvice.

2. JSON-P in actie

Het beleid van dezelfde oorsprong wordt niet opgelegd aan de tag, waardoor scripts over verschillende domeinen kunnen worden geladen. De JSON-P-techniek maakt hier gebruik van door het JSON-antwoord door te geven als het argument van de javascript-functie.

2.1. Voorbereiding

In onze voorbeelden zullen we dit eenvoudig gebruiken Bedrijf klasse:

naamloze vennootschap {privé lange id; private String naam; // standaard setters en getters} 

Deze klasse zal de verzoekparameters binden en door de server worden geretourneerd als JSON-weergave.

De Controller-methode is ook een eenvoudige implementatie - het retourneren van het Bedrijf voorbeeld:

@RestController openbare klasse CompanyController {@RequestMapping (waarde = "/ companyRest", produceert = MediaType.APPLICATION_JSON_VALUE) openbaar bedrijf getCompanyRest () {Bedrijf bedrijf = nieuw bedrijf (1, "Xpto"); retourbedrijf; }}

Aan de klantzijde kunnen we gebruik maken van jQuery bibliotheek om een ​​AJAX-verzoek te maken en te verzenden:

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

Overweeg een AJAX-verzoek tegen de volgende URL:

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

Het antwoord van de server zou het volgende zijn:

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

Omdat het verzoek is verzonden tegen hetzelfde schema, hetzelfde domein en dezelfde poort, wordt het antwoord niet geblokkeerd en worden JSON-gegevens door de browser toegestaan.

2.2. Cross-Origin-verzoek

Door de verzoek-URL te wijzigen in:

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

het antwoord wordt geblokkeerd door de browser, omdat het verzoek wordt verzonden vanaf localhost naar 127.0.0.1 dat wordt beschouwd als een ander domein en een schending vormt van het beleid van dezelfde oorsprong.

Met JSON-P zijn we in staat om een ​​callback-parameter toe te voegen aan het verzoek:

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

Aan de clientzijde is het net zo eenvoudig als het toevoegen van de volgende parameters aan het AJAX-verzoek:

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

De getCompanyData zal de functie zijn die wordt aangeroepen wanneer het antwoord wordt ontvangen.

Als de server het antwoord als volgt formatteert:

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

browsers zullen het niet blokkeren, omdat het het antwoord zal behandelen als een script dat is onderhandeld en overeengekomen tussen de client en de server vanwege het matchen getCompanyData in zowel het verzoek als het antwoord.

3. @ControllerAdvice Annotatie

De bonen zijn geannoteerd met @ControllerAdvice kunnen alle of een specifieke subset van controllers ondersteunen en wordt gebruikt om transversaal gedrag te kapselen dat wordt gedeeld tussen verschillende controllers. Typische gebruikspatronen zijn gerelateerd aan het afhandelen van uitzonderingen, het toevoegen van attributen aan modellen of het registreren van bindmiddelen.

Beginnend met de lente 4.1, @ControllerAdvice kan de implementaties van ResponseBodyAdvice interface waarmee het antwoord kan worden gewijzigd nadat het is geretourneerd door een controllermethode, maar voordat het is geschreven door een geschikte converter.

4. De respons wijzigen met SamenvattingJsonpResponseBodyAdvice

Ook te beginnen met Spring 4.1hebben we nu toegang tot de SamenvattingJsonpResponseBodyAdvice class - die het antwoord opmaakt volgens JSON-P-standaarden.

In dit gedeelte wordt uitgelegd hoe u de basisklasse in het spel zet en de respons wijzigt zonder de bestaande controllers te wijzigen.

Laten we beginnen met de configuratie om Spring-ondersteuning voor JSON-P in te schakelen:

@ControllerAdvice openbare klasse JsonpControllerAdvice breidt AbstractJsonpResponseBodyAdvice uit {openbare JsonpControllerAdvice () {super ("callback"); }} 

De ondersteuning is gemaakt met behulp van de SamenvattingJsonpResponseBodyAdvice klasse. De sleutel die wordt doorgegeven aan de supermethode is degene die zal worden gebruikt in de URL die JSON-P-gegevens opvraagt.

Met dit controlleradvies zetten we de respons automatisch om naar JSON-P.

5. JSON-P met lente in de praktijk

Met de eerder besproken configuratie zijn we in staat om onze REST-applicaties te laten reageren met JSON-P. In het volgende voorbeeld retourneren we bedrijfsgegevens, dus onze AJAX-verzoek-URL zou er ongeveer zo uit moeten zien:

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

Als resultaat van de vorige configuratie ziet het antwoord er als volgt uit:

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

Zoals besproken, wordt het antwoord in dit formaat niet geblokkeerd, ondanks dat het afkomstig is van een ander domein.

De JsonpControllerAdvice kan eenvoudig worden toegepast op elke methode die een antwoord retourneert dat is geannoteerd met @ResponseBody en ResponseEntity.

Er moet een functie met dezelfde naam worden doorgegeven in de callback, getCompanyData, voor het afhandelen van alle reacties.

6. Conclusie

Dit korte artikel laat zien hoe een anders vervelend werk van het formatteren van de respons om te profiteren van JSON-P wordt vereenvoudigd met behulp van de nieuwe functionaliteit in Spring 4.1.

De implementatie van de voorbeelden en codefragmenten is te vinden in dit GitHub-project.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS Jackson onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS