Що таке JSONP?
Важливо пам'ятати про jsonp, що це насправді не протокол або тип даних. Це просто спосіб завантаження сценарію на льоту та обробки сценарію, який вводиться на сторінку. У дусі JSONP це означає введення нового об’єкта javascript з сервера в клієнтську програму / скрипт.
Коли потрібен JSONP?
Це 1 метод надання асинхронному доступу домену / обробці даних з іншого на одній сторінці на одному домені. Перш за все, він використовується для перегляду обмежень CORS (Cross Origin Resource Sharing), які виникатимуть із запитом XHR (ajax). Навантаження сценарію не підпадає під обмеження CORS.
Як це робиться
Введення нового об’єкта javascript із сервера може бути реалізовано багатьма способами, але найпоширенішою практикою є те, щоб сервер реалізував виконання функції "зворотного дзвінка" з необхідним об'єктом, переданим у нього. Функція зворотного дзвінка - це лише функція, яку ви вже налаштували на клієнті, сценарій якого ви завантажуєте дзвінки, у момент завантаження сценарію для обробки переданих йому даних.
Приклад:
У мене є додаток, який реєструє всі предмети в будинку когось. Моя програма налаштована, і тепер я хочу отримати всі предмети в головній спальні.
Моя заявка ввімкнена app.home.com
. Апис, з якого мені потрібно завантажити дані, увімкнено api.home.com
.
Якщо сервер явно не встановлений для його дозволу, я не можу використовувати ajax для завантаження цих даних, оскільки навіть на сторінках окремих піддоменів застосовуються обмеження XHR CORS.
В ідеалі налаштовуйте речі, щоб дозволити X-домен XHR
В ідеалі, оскільки api та додаток перебувають у одному домені, я можу мати доступ для налаштування заголовків api.home.com
. Якщо це зробити, я можу додати елемент Access-Control-Allow-Origin:
заголовка, що надає доступ app.home.com
. Якщо припустити, що заголовок налаштований так: Access-Control-Allow-Origin: "http://app.home.com"
це набагато безпечніше, ніж налаштування JSONP. Це тому, що app.home.com
можна отримати все, що хоче, api.home.com
не api.home.com
надаючи CORS доступ до всього Інтернету.
Наведене вище рішення XHR неможливо. Налаштування JSONP На моєму клієнтському сценарії: я налаштовував функцію для обробки відгуку з сервера під час здійснення дзвінка JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Потрібно налаштувати сервер, щоб повернути міні-скрипт, схожий на те, що "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
він може бути розроблений для повернення такої рядки, якщо щось подібне //api.home.com?getdata=room&room=main_bedroom
викликається.
Потім клієнт встановлює тег сценарію як такий:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Це завантажує сценарій і негайно викликає window.processJSONPResponse()
сервер як написаний / ехо / роздрукований. Дані, передані як параметр функції, тепер зберігаються в dataFromServer
локальній змінній, і ви можете робити з нею все, що вам потрібно.
Прибирати
Після того, як клієнт має дані, тобто. одразу після додавання сценарію до DOM, елемент сценарію можна видалити з DOM:
script.parentNode.removeChild(script);