Я понимаю JSON, но не JSONP. Документ Википедии о JSON является (был) лучшим результатом поиска для JSONP. Это говорит это:
JSONP или «JSON with padding» - это расширение JSON, префикс которого указан в качестве входного аргумента самого вызова.
А? Какой звонок? Это не имеет никакого смысла для меня. JSON - это формат данных. Там нет звонка.
Результат поиска второго из какого - то парня по имени Реми , который пишет это о JSONP:
JSONP - это инъекция тега сценария, передающая ответ от сервера в указанную пользователем функцию.
Я могу это понять, но это все еще не имеет никакого смысла.
Так что же такое JSONP? Почему он был создан (какую проблему он решает)? И зачем мне это использовать?
Приложение : Я только что создал новую страницу для JSONP в Википедии; теперь он содержит четкое и подробное описание JSONP, основанное на ответе jvenema .
источник
Ответы:
Это на самом деле не слишком сложно ...
Допустим, вы находитесь на домене
example.com
и хотите сделать запрос на доменexample.net
. Для этого вам нужно пересечь доменные границы, нет-нет в большинстве браузерных стран.Единственный элемент, который обходит это ограничение - это
<script>
теги. Когда вы используете тег сценария, ограничение домена игнорируется, но при нормальных обстоятельствах вы ничего не можете сделать с результатами, сценарий просто оценивается.Введите
JSONP
. Когда вы отправляете запрос на сервер с поддержкой JSONP, вы передаете специальный параметр, который немного сообщает серверу о вашей странице. Таким образом, сервер может красиво обернуть свой ответ так, как может справиться ваша страница.Например, скажем, сервер ожидает параметр, вызываемый
callback
для включения его возможностей JSONP. Тогда ваш запрос будет выглядеть так:Без JSONP это может вернуть некоторый базовый объект JavaScript, например так:
Однако в JSONP, когда сервер получает параметр «обратного вызова», он оборачивает результат немного по-другому, возвращая что-то вроде этого:
Как видите, теперь он будет вызывать указанный вами метод. Итак, на вашей странице вы определяете функцию обратного вызова:
И теперь, когда скрипт загружен, он будет оценен, и ваша функция будет выполнена. Вуаля, междоменные запросы!
Стоит также отметить одну важную проблему с JSONP: вы теряете контроль над запросом. Например, нет «хорошего» способа вернуть правильные коды ошибок. В результате вы используете таймеры для мониторинга запроса и т. Д., Что всегда немного подозрительно. Предложение для JSONRequest является отличным решением, позволяющим создавать междоменные сценарии, поддерживать безопасность и обеспечивать надлежащий контроль над запросом.
В эти дни (2015) CORS является рекомендуемым подходом против JSONRequest. JSONP по-прежнему полезен для поддержки старых браузеров, но с учетом последствий для безопасности, если у вас нет выбора, CORS - лучший выбор.
источник
JSONP - это действительно простая уловка для преодоления политики домена XMLHttpRequest . (Как вы знаете, никто не может отправить AJAX (XMLHttpRequest) запрос в другой домен.)
Итак, вместо использования XMLHttpRequest мы должны использовать HTML-теги сценариев , которые вы обычно используете для загрузки файлов js, чтобы js мог получать данные из другого домена. Звучит странно?
Дело в том, что теги сценариев можно использовать аналогично XMLHttpRequest ! Проверь это:
Вы получите сегмент скрипта, который выглядит следующим образом после загрузки данных:
Однако это немного неудобно, потому что мы должны извлечь этот массив из тега script . Поэтому создатели JSONP решили, что это будет работать лучше (и это так):
Заметьте функцию my_callback там? Итак, когда JSONP- сервер получит ваш запрос и найдет параметр обратного вызова, вместо возврата обычного массива js он вернет следующее:
Посмотрите, где прибыль: теперь мы получаем автоматический обратный вызов (my_callback), который будет запущен, как только мы получим данные.
Это все, что нужно знать о JSONP : это обратный вызов и теги сценария.
ПРИМЕЧАНИЕ: это простые примеры использования JSONP, это не готовые к работе скрипты.
Базовый пример JavaScript (простой канал Twitter с использованием JSONP)
Базовый пример jQuery (простой канал Twitter с использованием JSONP)
JSONP означает JSON с отступом . (очень плохо названная техника, поскольку она на самом деле не имеет ничего общего с тем, что большинство людей считает «заполнением».)
источник
JSONP работает путем создания элемента «script» (либо в разметке HTML, либо вставляется в DOM через JavaScript), который запрашивает расположение удаленной службы данных. Ответ представляет собой JavaScript, загруженный в ваш браузер с именем предопределенной функции и передаваемым параметром, который запрашивает данные JSON. Когда скрипт выполняется, функция вызывается вместе с данными JSON, что позволяет запрашивающей странице получать и обрабатывать данные.
Для дальнейшего чтения посетите: https://blogs.sap.com/2013/07/15/secret-behind-jsonp/
фрагмент кода на стороне клиента
Серверная часть кода PHP
источник
Потому что вы можете попросить сервер добавить префикс к возвращенному объекту JSON. Например
function_prefix(json_object);
для того, чтобы браузер
eval
«встроил» строку JSON в качестве выражения. Этот трюк позволяет серверу «вставлять» код JavaScript непосредственно в браузер клиента, что позволяет обойти ограничения «одного источника».Другими словами, вы можете добиться междоменного обмена данными .
Обычно
XMLHttpRequest
не разрешает междоменный обмен данными напрямую (нужно пройти через сервер в одном домене), тогда как:<script src="some_other_domain/some_data.js&prefix=function_prefix
> `можно получить доступ к данным из домена, отличного от источника.Также стоит отметить: несмотря на то, что сервер должен рассматриваться как «доверенный» перед попыткой такого рода «уловки», побочные эффекты возможного изменения формата объекта и т. Д. Могут быть ограничены. Если
function_prefix
для получения объекта JSON используется (т. Е. Правильная функция js), упомянутая функция может выполнить проверки перед принятием / дальнейшей обработкой возвращенных данных.источник
JSONP отлично подходит для обхода ошибок междоменного скриптинга. Вы можете использовать службу JSONP исключительно с JS без необходимости в реализации прокси AJAX на стороне сервера.
Вы можете использовать сервис b1t.co, чтобы увидеть, как он работает. Это бесплатный сервис JSONP, который позволяет минимизировать ваши URL. Вот URL для использования в сервисе:
http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultsCallBack]&url=[escapedUrlToMinify]
Например, вызов http://b1t.co/Site/api/External/MakeUrlWithGet?callback=whwhatJavascriptName&url=google.com.
вернется
И, таким образом, когда этот get загружается в ваш js как src, он автоматически запускает независимо от JavascriptName, которое вы должны реализовать в качестве функции обратного вызова:
Чтобы фактически сделать вызов JSONP, вы можете сделать это несколькими способами (включая использование jQuery), но вот чистый пример JS:
Пошаговый пример и веб-сервис jsonp для практики доступны по адресу: этот пост
источник
Простой пример использования JSONP.
client.html
server.php
источник
Прежде чем понимать JSONP, вам необходимо знать формат JSON и XML. В настоящее время наиболее часто используемым форматом данных в Интернете является XML, но XML очень сложен. Это делает пользователей неудобными для обработки встроенных в веб-страницах.
Чтобы JavaScript мог легко обмениваться данными, даже в качестве программы обработки данных, мы используем формулировку в соответствии с объектами JavaScript и разработали простой формат обмена данными, который является JSON. JSON можно использовать как данные или как программу JavaScript.
JSON может быть непосредственно встроен в JavaScript, используя их, вы можете напрямую выполнять определенную программу JSON, но из-за ограничений безопасности механизм песочницы браузера отключает междоменное выполнение кода JSON.
Чтобы JSON можно было передать после выполнения, мы разработали JSONP. JSONP обходит пределы безопасности браузера с помощью функции обратного вызова JavaScript и тега <script>.
Вкратце, он объясняет, что такое JSONP, какую проблему он решает (когда его использовать).
источник
TL; DR
JSONP - это старый прием, изобретенный для обхода ограничения безопасности, которое запрещает нам получать данные JSON с другого сервера (другого источника * ).
Трюк работает с использованием
<script>
тега, который запрашивает JSON из этого места, например:,{ "user":"Smith" }
но обернут в функцию, фактический JSONP («JSON with Padding»):Получение этого в этой форме позволяет нам использовать данные в нашей
peopleDataJSONP
функции. JSONP - плохая практика , не используйте ее (читайте ниже)Проблема
Скажем, мы находимся
ourweb.com
и хотим получать данные JSON (или любые необработанные данные)anotherweb.com
. Если бы мы использовали запрос GET (напримерXMLHttpRequest
,fetch
вызов$.ajax
и т. Д.), Наш браузер сказал бы, что это не разрешено с этой ужасной ошибкой:Как получить данные, которые мы хотим? Ну,
<script>
теги не подчиняются всему этому ограничению сервера (origin *)! Вот почему мы можем загрузить библиотеку, такую как jQuery или Google Maps, с любого сервера, например, CDN, без каких-либо ошибок.Важный момент : если вы подумаете об этом, эти библиотеки - это реально работающий JS-код (обычно это огромная функция со всей логикой внутри). Но необработанные данные? Данные JSON не являются кодом . Там нет ничего, чтобы бежать; это просто простые данные.
Таким образом, мы не можем обрабатывать или манипулировать нашими ценными данными. Браузер загрузит данные, на которые указывает наш
<script>
тег, и при обработке будет по праву жаловаться:Взлом JSONP
Старый / хакерский способ использовать эти данные? Нам нужен этот сервер для отправки его с некоторой логикой, поэтому, когда он будет загружен, ваш код в браузере сможет использовать эти данные. Таким образом, сторонний сервер отправляет нам данные JSON внутри функции JS. Сами данные устанавливаются как входные данные этой функции. Это выглядит так:
что делает его JS-кодом, наш браузер будет анализировать без жалоб! Точно так же, как это происходит с библиотекой jQuery. Теперь, чтобы получить это, клиент «запрашивает» JSON-дружественный сервер для него, обычно это делается так:
Наш браузер получит JSONP с таким именем функции, поэтому нам нужна функция с таким же именем в нашем коде, например:
Или вот так, тот же результат:
Браузер загрузит JSONP и запустит его, который вызывает нашу функцию , где аргументом
data
будет наш JSON. Теперь мы можем делать с нашими данными все, что захотим.Не используйте JSONP, используйте CORS
JSONP - это хакерский сайт с несколькими недостатками:
Вывод заключается в том, что в настоящее время нет необходимости использовать его .
JSONP - это хитрость для получения данных JSON с другого сервера, но мы будем нарушать тот же принцип безопасности (Same-Origin), если нам понадобятся другие виды межсайтового контента.
Вы должны прочитать о CORS здесь , но суть этого:
* происхождение определяется 3 вещами: протокол , порт и хост . Так, например,
https://web.com
источник отличается отhttp://web.com
(другой протокол) иhttps://web.com:8081
(другой порт) и, очевидно,https://thatotherweb.net
(другой хост)источник
Хорошие ответы уже были даны, мне просто нужно дать свою часть в виде блоков кода в javascript (я также включу более современное и лучшее решение для запросов между источниками: CORS с заголовками HTTP):
JSONP:
1.client_jsonp.js
2.server_jsonp.js
CORS :
3.client_cors.js
4.server_cors.js
источник
Вот сайт с отличными примерами , с объяснениями от простейшего использования этой техники до самого продвинутого в плоскости JavaScript:
4PDA / JSONP
Один из моих самых любимых методов, описанных выше, - это динамический результат JSON , который позволяет отправлять JSON в файл PHP с параметром URL , а также позволяет файлу PHP возвращать объект JSON на основе получаемой информации .
Такие инструменты, как jQuery, также имеют возможности использовать JSONP :
источник