Я знаю, что JSONP
JSON
с заполнением.
Я понимаю, что такое JSON и как его использовать с jQuery.getJSON()
. Однако я не понимаю концепцию callback
при введении JSONP.
Может ли кто-нибудь объяснить мне, как это работает?
Я знаю, что JSONP
JSON
с заполнением.
Я понимаю, что такое JSON и как его использовать с jQuery.getJSON()
. Однако я не понимаю концепцию callback
при введении JSONP.
Может ли кто-нибудь объяснить мне, как это работает?
Этому ответу больше шести лет. Хотя концепции и применение JSONP не изменились (т. Е. Детали ответа все еще действительны), вам следует старайтесь использовать CORS там, где это возможно (например, ваш сервер или API поддерживает его, а поддержка браузера адекватна), поскольку JSONP имеет неотъемлемые риски безопасности.
JSONP (JSON с заполнением) - это метод, обычно используемый для обхода междоменных политик в веб-браузерах. (Вам не разрешено делать AJAX-запросы к веб-странице, которую браузер воспринимает как находящуюся на другом сервере.)
JSON и JSONP по-разному ведут себя на клиенте и сервере. Запросы JSONP не отправляются с использованием XMLHTTPRequest
и связанных методов браузера. Вместо этого создается тег <script>
, источником которого является целевой URL. Затем этот тег скрипта добавляется в DOM (обычно внутри элемента <head>
).
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
// success
};
};
xhr.open("GET", "somewhere.php", true);
xhr.send();
var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';
document.getElementsByTagName("head")[0].appendChild(tag);
Разница между ответом JSON и ответом JSONP заключается в том, что объект ответа JSONP передается в качестве аргумента функции обратного вызова.
{ "bar": "baz" }
foo( { "bar": "baz" } );
Вот почему вы видите запросы JSONP, содержащие параметр callback
, чтобы сервер знал имя функции, которая оборачивает ответ.
Эта функция должна существовать в глобальной области в момент, когда тег <script>
оценивается браузером (после завершения запроса).
Еще одно различие между обработкой ответа JSON и ответа JSONP, о котором следует помнить, заключается в том, что любые ошибки синтаксического анализа в ответе JSON могут быть обнаружены путем заключения попытки оценить responseText в операторе try / catch. Из-за природы ответа JSONP ошибки синтаксического анализа в ответе вызовут неуловимую ошибку синтаксического анализа JavaScript.
Оба формата могут реализовывать ошибки тайм-аута, устанавливая тайм-аут перед инициированием запроса и очищая тайм-аут в обработчике ответа.
Полезность использования jQuery для выполнения запросов JSONP заключается в том, что jQuery выполняет вся работа за вас в фоновом режиме.
По умолчанию jQuery требует, чтобы вы включили &callback=?
в URL-адрес вашего AJAX-запроса. jQuery примет указанную вами функцию success
, присвоит ей уникальное имя и опубликует ее в глобальной области. Затем он заменит вопросительный знак ?
в &callback=?
присвоенным им именем.
Следующее предполагает объект ответа { "bar" : "baz" }
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
document.getElementById("output").innerHTML = eval('(' + this.responseText + ')').bar;
};
};
xhr.open("GET", "somewhere.php", true);
xhr.send();
function foo(response) {
document.getElementById("output").innerHTML = response.bar;
};
var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';
document.getElementsByTagName("head")[0].appendChild(tag);
JSON.parse
на eval
в целях безопасности.
- person Levi Haskell; 30.12.2015
XMLHttpRequest
(обратите внимание, что этот ответ относится к 2010 году!). Учитывая, что эти браузеры больше не поддерживаются Microsoft, а в целях безопасности JSONP, по возможности следует использовать CORS (где это возможно).
- person Matt; 28.04.2016
text/ng-template
.
- person Claudiu; 20.06.2016
Скажем, у вас есть URL-адрес, по которому вы получили данные в формате JSON, например:
{'field': 'value'}
... и у вас был аналогичный URL-адрес, за исключением того, что он использовал JSONP, которому вы передали имя функции обратного вызова myCallback (обычно это делается путем передачи ей параметра запроса с именем callback, например http://example.com/dataSource?callback=myCallback
). Затем он вернется:
myCallback({'field':'value'})
... который является не просто объектом, а на самом деле кодом, который может быть выполнен. Поэтому, если вы определите функцию myFunction
в другом месте своей страницы и выполните этот сценарий, он будет вызываться с данными из URL-адреса.
Самое интересное в этом: вы можете создать тег скрипта и использовать свой URL (с параметром callback
) в качестве атрибута src
, и браузер запустит его. Это означает, что вы можете обойти политику безопасности «одинакового происхождения» (поскольку браузеры позволяют запускать теги сценария из источников, отличных от домена страницы).
Это то, что делает jQuery, когда вы делаете запрос ajax (используя .ajax
с 'jsonp' в качестве значение свойства dataType
). Например.
$.ajax({
url: 'http://example.com/datasource',
dataType: 'jsonp',
success: function(data) {
// your code to handle data here
}
});
Здесь jQuery заботится об имени функции обратного вызова и параметре запроса, делая API идентичным другим вызовам ajax. Но в отличие от других типов запросов ajax, как уже упоминалось, вы не ограничены получением данных из того же источника, что и ваша страница.
JSONP - это способ обойти политику одинакового происхождения браузера. Как? Нравится:
Цель здесь - сделать запрос к otherdomain.com
и alert
имени в ответе. Обычно мы делаем запрос AJAX:
$.get('otherdomain.com', function (response) {
var name = response.name;
alert(name);
});
Однако, поскольку запрос отправляется в другой домен, это не сработает.
Однако мы можем сделать запрос, используя тег <script>
. Оба <script src="otherdomain.com"></script>
и $.get('otherdomain.com')
приведут к тому, что будет сделан один и тот же запрос:
GET otherdomain.com
В: Но если мы используем тег <script>
, как мы можем получить доступ к ответу? Нам нужно получить к нему доступ, если мы хотим alert
это сделать.
A: Мы не можем. Но вот что мы могли бы сделать - определить функцию, которая использует ответ, а затем сказать серверу, чтобы он ответил с помощью JavaScript, который вызывает нашу функцию с ответом в качестве аргумента.
В: Но что, если сервер не сделает этого за нас, а только захочет вернуть нам JSON?
A: Тогда мы не сможем его использовать. JSONP требует взаимодействия сервера.
В: Использование тега <script>
уродливо.
О: Библиотеки, такие как jQuery, делают его лучше. Бывший:
$.ajax({
url: "http://otherdomain.com",
jsonp: "callback",
dataType: "jsonp",
success: function( response ) {
console.log( response );
}
});
Он работает, динамически создавая элемент DOM тега <script>
.
В: Теги <script>
отправляют только запросы GET - что, если мы хотим сделать запрос POST?
О: Тогда JSONP у нас работать не будет.
В: Ничего страшного, я просто хочу сделать запрос GET. JSONP великолепен, и я собираюсь его использовать - спасибо!
A: На самом деле, это не так уж и здорово. Это действительно просто взлом. И это не самое безопасное для использования. Теперь, когда доступен CORS, вы должны использовать его, когда это возможно.
Я нашел полезную статью, которая также объясняет тему довольно ясно и простым языком. Ссылка - JSONP.
Некоторые из важных моментов:
Работа выглядит следующим образом:
<script src="url?callback=function_name">
включен в HTML-код