Я использую метод jQuery $.ajax
для извлечения данных из JSONP-совместимого веб-сервиса, и, насколько получение ответа и отображение полученных данных в моем HTML, все, кажется, работает нормально. Тем не менее, я не смог получить способ обратного вызова метода ajax для запуска. Еще более странно, что даже когда я получаю действительный ответ от службы, всегда срабатывает обратный вызов ошибки.
Вот пример простой js-функции, которую я проверил для этого:
function doJsonp()
{
$.ajax({
url: "http://example.com/api/service?callback=blah",
dataType: "jsonp",
crossDomain: true,
success: function() { console.log("success"); }, // This is never fired
error: function() { console.log("error"); } // This is always fired
});
}
и соответствующей функции обратного вызова:
function blah(data)
{
console.log(data); // This is called properly
}
Из чтения подобных вопросов здесь, в SO и в других местах, кажется, что это чаще всего вызвано службой, возвращающей JSON, которая не проверяет. Для моих целей я использую собственный веб-сервис, но пробовал и другие службы JSONP, например, такие, как Flickr, например:
http://api.flickr.com/services/feeds/[email protected]&lang=en-us&format=json&jsoncallback=blah
Как JSON из службы Flickr, так и my проверяют использование jsonlint, так что, похоже, это не проблема, насколько я могу судить.
В поисках решений этой проблемы я попытался использовать плагин jQuery под названием jquery-jsonp, найденный в http://code.google.com/p/jquery-jsonp/. Это заменяет вызов jQuery $.ajax
его собственным $.jsonp
, поэтому приведенный выше код выглядит следующим образом:
function doJsonp()
{
$.jsonp({
url: "http://example.com/api/service?callback=blah",
success: function() { console.log("success"); },
error: function() { console.log("error"); }
});
}
Однако результат тот же, и обратный вызов успеха никогда не срабатывает. Любая помощь или толчок в правильном направлении были бы очень благодарны!