JSONP: как построить ajax-запрос?

#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