Это на самом деле не так уж сложно ...
Допустим, вы находитесь на домене example.com
и хотите сделать запрос на домен example.net
. Для этого вам нужно пересечь доменные границы, нет-нет в большинстве браузерных стран.
Единственный элемент, который обходит это ограничение - это <script>
теги. Когда вы используете тег сценария, ограничение домена игнорируется, но при нормальных обстоятельствах вы не можете делать что-либо с результатами, сценарий просто оценивается.
Введите JSONP
. Когда вы отправляете запрос на сервер с поддержкой JSONP, вы передаете специальный параметр, который немного сообщает серверу о вашей странице. Таким образом, сервер может красиво обернуть свой ответ так, как может справиться ваша страница.
Например, допустим, сервер ожидает параметр с именем callback
, чтобы включить его возможности JSONP. Тогда ваш запрос будет выглядеть так:
http://www.example.net/sample.aspx?callback=mycallback
Без JSONP это может вернуть некоторый базовый объект JavaScript, например:
{ foo: 'bar' }
Однако в JSONP, когда сервер получает параметр «обратного вызова», он оборачивает результат немного по-другому, возвращая что-то вроде этого:
mycallback({ foo: 'bar' });
Как видите, теперь он будет вызывать указанный вами метод. Итак, на вашей странице вы определяете функцию обратного вызова:
mycallback = function(data){
alert(data.foo);
};
И теперь, когда скрипт загружен, он будет оценен, и ваша функция будет выполнена. Вуаля, междоменные запросы!
Стоит также отметить одну важную проблему с JSONP: вы теряете много контроля над запросом. Например, нет «хорошего» способа вернуть правильные коды ошибок. В результате вы используете таймеры для мониторинга запроса и т. Д., Что всегда немного подозрительно. Предложение для JSONRequest является отличным решением, позволяющим создавать междоменные сценарии, поддерживать безопасность и обеспечивать надлежащий контроль над запросом.
В эти дни (2015), CORS - рекомендуемый подход по сравнению с JSONRequest. JSONP по-прежнему полезен для поддержки старых браузеров, но с учетом последствий для безопасности, если у вас нет выбора, CORS - лучший выбор.