Что такое 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.
В идеале настройте все, чтобы разрешить XHR домена x
В идеале, поскольку 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);