#jquery #json #jsonp
#jquery #json #jsonp
Вопрос:
Я пытаюсь работать с JSONP API в разных доменах. Это пример данных, которые он возвращает:
photos({"marker":{"@attributes":{"id":"30601","latitude":"52.638061","longitude":"-2.117067","feature":"3","caption":"cat","thumbnailSizes":"60|120|150|180|200|250|300|350|400|400|425|450|500|640"}}});
Как я могу создать Ajax-вызов, который использует эти данные? Я продолжаю получать сообщения об ошибках.
Это то, что я пытаюсь в данный момент:
$.ajax({
url: pm_url,
data: {},
type: "get",
dataType: "jsonp",
cache: false,
success: function(data) {
console.log(data);
},
error: function() {
alert('Sorry, there was a problem getting the photos!');
}
В Firebug я вижу, что указанные выше данные извлекаются, но затем я вижу сообщение об ошибке.
Что не так с запросом? (Или данные — хотя они проверяются как JSONP.)
Обновить:
Спасибо за предложения. Сейчас я пытаюсь:
var photos = function (data) {
alert(data);
};
$.ajax({
url: pm_url,
dataType: 'jsonp',
jsonpCallback: 'photos',
});
Как ни странно, это вызов двух URL-адресов в Firebug:
http://myapi.com/file.jsonp?x=1amp;y=2?callback=?
http://myapi.com/file.jsonp?x=1amp;y=2?callback=photosamp;_=1304982373561
Первый URL отображается в консоли как ошибка. Что я делаю не так?!
Возможно, что сам API неверен (они требуют суффикс .jsonp и игнорируют значение обратного вызова, поэтому имя функции исправлено), но я надеялся, что смогу обойти это.
Комментарии:
1. В Firebug / Fiddler каков ответ на запрос?
2. Сам запрос соответствует 200 ОК, возвращая указанные выше данные, но Firebug сообщает: «photos — это не функция». Затем я вижу сообщение об ошибке.
3. Хорошо, действительно плохо справляюсь с JSONP. Может ли кто-нибудь помочь мне заставить этот jsFiddle что-то делать, просто используя Twitter JSONP API? jsfiddle.net/R7EPt/8 спасибо!
4. Здесь не совсем используется JSONP, но он работает. Надеюсь, вы сможете использовать его здесь, где вам нужно: jsfiddle.net/R7EPt/9
Ответ №1:
Название функции(фотографии) неверно. jQuery отправит GET-параметр с именем «обратный вызов», значением этого параметра является имя, которое должна иметь функция.
Ответ, PHP-пример:
<?php echo $_GET['callback'].'('.json_encode($some_object).');';?>
Чтобы объяснить, что происходит с jsonp:
предполагая отправку параметра обратного вызова со значением jquery1234: jQuery создаст временную функцию:
function jquery1234(data){return data;}
Итак, если вы отправляете ответ, подобный
jquery1234({'somevar':'somevalue'});
…jQuery создаст script-элемент этого ответа, функция будет вызвана, и объект будет передан успешной функции.
Комментарии:
1. Спасибо. Могу ли я каким-либо образом принудительно вызвать параметр обратного вызова ‘photos’? (У меня нет контроля над API.)
2. @simon: Да, вы можете добавить
jsonpCallback:'photos'
в конфигурацию. Смотрите больше информации о jQuery.ajax API
Ответ №2:
Почему бы не использовать $.getJSON() ?http://api.jquery.com/jQuery.getJSON
Комментарии:
1. Попробовал это первым, также выдал мне ошибки. Должен сказать, что JSONP на данный момент довольно сбит с толку.
2. междоменные ограничения — @antonR