Пролет JSON-P с Джаксън

ПОЧИВКА Най-горе

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА Jackson Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

Ако сте разработвали нещо в мрежата, сте наясно с ограниченията на политиките за същия произход, които браузърите имат, когато се занимават с AJAX заявки. Простият преглед на ограничението е, че всяка заявка, произхождаща от различен домейн, схема или порт, няма да бъде разрешена.

Един от начините за отпускане на това ограничение на браузъра при работа с JSON данни - е използването на JSON с подплата (JSON-P).

Тази статия разглежда поддръжката на Spring за работа с JSON-P данни - с помощта на AbstractJsonpResponseBodyAdvice .

2. JSON-P в действие

Политиката със същия произход не се налага върху етикет, позволяващ скриптове да се зареждат в различни домейни. Техниката JSON-P се възползва от това, като предаде отговора JSON като аргумент на функцията javascript.

2.1. Подготовка

В нашите примери ще използваме този прост фирмен клас:

public class Company { private long id; private String name; // standard setters and getters } 

Този клас ще обвърже параметрите на заявката и ще бъде върнат от сървъра като JSON представяне.

Методът на контролера също е проста реализация - връщане на екземпляра на компанията :

@RestController public class CompanyController { @RequestMapping(value = "/companyRest", produces = MediaType.APPLICATION_JSON_VALUE) public Company getCompanyRest() { Company company = new Company(1, "Xpto"); return company; } }

От страна на клиента можем да използваме jQuery библиотека за създаване и изпращане на AJAX заявка:

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

Помислете за заявка AJAX срещу следния URL:

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

Отговорът от сървъра ще бъде следният:

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

Тъй като заявката е изпратена срещу същата схема, домейн и порт, отговорът няма да бъде блокиран и JSON данните ще бъдат разрешени от браузъра.

2.2. Искане за кръстосан произход

Чрез промяна на URL адреса на заявката на:

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

отговорът ще бъде блокиран от браузъра, поради изпратена заявка от localhost до 127.0.0.1, която се счита за различен домейн и представлява нарушение на политиката за същия произход.

С JSON-P можем да добавим параметър за обратно извикване към заявката:

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

От страна на клиента е толкова лесно, колкото да добавите следните параметри към заявката AJAX:

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

В getCompanyData ще бъде функцията нарича, когато се получи отговор.

Ако сървърът форматира отговора по следния начин:

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

браузърите няма да го блокират, тъй като той ще третира отговора като скрипт, договорен и съгласуван между клиента и сървъра, поради съвпадение на getCompanyData както в заявката, така и в отговора.

3. Анотация на @ControllerAdvice

Зърната, анотирани с @ControllerAdvice, са в състояние да подпомогнат всички или конкретна подгрупа на контролерите и се използват за капсулиране на поведение на кръстосване, споделено между различни контролери. Типичните модели на използване са свързани с обработка на изключения, добавяне на атрибути към модели или регистриране на свързващи елементи.

Започвайки с Spring 4.1 , @ControllerAdvice е в състояние да регистрира внедряванията на интерфейса ResponseBodyAdvice, който позволява промяна на отговора след връщането му чрез метод на контролер, но преди да бъде написан от подходящ конвертор.

4. Промяна на отговора с помощта на AbstractJsonpResponseBodyAdvice

Също като започнем с Spring 4.1 , вече имаме достъп до класа AbstractJsonpResponseBodyAdvice - който форматира отговора според стандартите JSON-P.

Този раздел обяснява как да включите основния клас и да промените отговора, без да правите промени в съществуващите контролери.

За да активираме пролетната поддръжка за JSON-P, нека започнем с конфигурацията:

@ControllerAdvice public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpControllerAdvice() { super("callback"); } } 

Поддръжката се извършва с помощта на класа AbstractJsonpResponseBodyAdvice . Ключът, предаден на супер метода, е този, който ще се използва в URL адреса, изискващ JSON-P данни.

С този съвет за контролер ние автоматично преобразуваме отговора в JSON-P.

5. JSON-P с пролетта на практика

С предварително обсъдената конфигурация на място, ние можем да накараме нашите REST приложения да реагират с JSON-P. В следващия пример ще върнем данните на компанията, така че URL адресът ни за заявка AJAX трябва да бъде нещо подобно:

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

В резултат на предишната конфигурация отговорът ще изглежда по следния начин:

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

Както беше обсъдено, отговорът в този формат няма да бъде блокиран, въпреки че произхожда от друг домейн.

В JsonpControllerAdvice може лесно да се приложи към всеки метод, който връща отговор с пояснение @ResponseBody и ResponseEntity .

Трябва да има функция със същото име, предадено в обратното повикване, getCompanyData , за обработка на всички отговори.

6. Заключение

Тази кратка статия показва как иначе досадната работа по форматиране на отговора, за да се възползвате от JSON-P, е опростена с помощта на новата функционалност през пролетта 4.1.

Прилагането на примерите и кодовите фрагменти може да бъде намерено в този проект на GitHub.

ПОЧИВКА отдолу

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА Джаксън отдолу

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА