Что такое JSONP?
Важная вещь, которую следует помнить с помощью jsonp, это то, что на самом деле это не протокол или тип данных. Это просто способ загрузить скрипт на лету и обработать скрипт, который представлен на странице. В духе JSONP это означает введение нового объекта javascript с сервера в клиентское приложение / скрипт.
Когда нужен JSONP?
Это 1 метод, позволяющий одному домену асинхронно получать доступ / обрабатывать данные из другого на той же странице. Прежде всего, он используется для отмены ограничений CORS (Cross Origin Resource Sharing), которые могут возникнуть при запросе XHR (ajax). На загрузку скрипта не распространяются ограничения CORS.
Как это делается
Представление нового объекта javascript с сервера может быть реализовано многими способами, но наиболее распространенной практикой является выполнение сервером функции обратного вызова с передачей в нее необходимого объекта. Функция обратного вызова - это просто функция, которую вы уже настроили на клиенте, которую сценарий загружает вызовы в точке сценарий загружает для обработки переданных ему данных.
Пример:
У меня есть приложение, которое регистрирует все предметы в чьем-то доме. Мое приложение настроено, и теперь я хочу получить все предметы в главной спальне.
Мое приложение на app.home.com
. API, с которого мне нужно загрузить данные, находятся на 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()
как записано / echo / распечатано сервером. Данные, переданные в качестве параметра функции, теперь сохраняются в локальной переменной dataFromServer
, и вы можете делать с ней все, что вам нужно.
Очистить
Как только у клиента есть данные, т.е. сразу после добавления сценария в DOM элемент сценария можно удалить из DOM:
script.parentNode.removeChild(script);