Запрос jsonp не работает в Firefox - PullRequest
1 голос
/ 18 декабря 2008

Я пытаюсь выполнить простой удаленный вызов json с помощью jquery. Я пытаюсь использовать Reddit API. http://api.reddit.com. Возвращает действительный объект json.

Если я вызываю локальный файл (который возвращается с веб-сайта, сохраненного на моем локальном диске), все работает нормально.

$(document).ready(function() {
    $.getJSON("js/reddit.json", function (json) {
        $.each(json.data.children, function () {
            title = this.data.title;
            url = this.data.url;
            $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>");
        });
    });
});

Если я тогда попытаюсь преобразовать его в удаленный вызов:

$(document).ready(function() {
    $.getJSON("http://api.reddit.com", function (json) {
        $.each(json.data.children, function () {
            title = this.data.title;
            url = this.data.url;
            $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>");
        });
    });
});

он будет хорошо работать в Safari, но не в Firefox. Это ожидаемо, так как Firefox не делает удаленных вызовов из-за безопасности или чего-то еще. Хорошо.

В документах jquery говорят, что делать это так (jsonp):

$(document).ready(function() {
    $.getJSON("http://api.reddit.com?jsoncallback=?", function (json) {
        $.each(json.data.children, function () {
            title = this.data.title;
            url = this.data.url;
            $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>");
        });
    });
});

однако теперь он перестает работать как в Safari, так и в Firefox. Запрос сделан, но то, что возвращается с сервера, похоже, игнорируется.

Это проблема с кодом, который я пишу, или с чем-то, что сервер возвращает? Как я могу диагностировать эту проблему?

РЕДАКТИРОВАТЬ Изменил адрес на реальный.

Ответы [ 4 ]

3 голосов
/ 31 декабря 2008

JSONP - это то, что должно поддерживаться на сервере. Я не могу найти документацию, но похоже, что если Reddit поддерживает JSONP, это не относится к переменной запроса jsoncallback.

То, что делает JSONP - это обтекание текста JSON вызовом функции JavaScript, это позволяет обрабатывать текст JSON любой функцией, уже определенной в вашем коде. Однако эта функция должна быть доступна из глобальной области видимости. Похоже, что метод getQSON JQuery генерирует для вас имя функции и присваивает его переменной строки запроса jsoncallback.

1 голос
/ 18 декабря 2008

URL, на который вы указываете (www.redit.com ...), не возвращает JSON! Не уверен, откуда идет синдикация JSON из reddit, но вы можете начать с примера из docs :

$(document).ready(function() {
  $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function (data) {
    $.each(data.items, function(i,item){
        $("<img/>").attr("src", item.media.m).appendTo("#redditbox");
        if ( i == 4 ) return false;
      });

});

});

(извиняюсь за форматирование)

РЕДАКТИРОВАТЬ Теперь, когда я перечитал ваше сообщение, я вижу, вы намеревались перейти на api.reddit.com, к сожалению, у вас нет правильного имени параметра для параметра обратного вызова json. Возможно, вам придется дополнительно обратиться к документации reddit, чтобы узнать, поддерживают ли они JSONP и как должно называться имя параметра обратного вызова.

0 голосов
/ 15 мая 2009

http://api.reddit.com/ возвращает JSON, но не для JSONP. Вы можете проверить это, если у вас есть GET, с помощью

% GET http://api.reddit.com/?callback=foo

, который выводит поток JSON без оболочки JSONP.

http://code.reddit.com/browser/r2/r2/controllers/api.py (строка 84) показывает код, который ищет «обратный вызов» (не «jsoncallback»). Это может быть хорошей отправной точкой для изучения кода Reddit, чтобы понять, в чем заключается хитрость.

0 голосов
/ 05 января 2009

Я не уверен насчет reddit.com, но для сайтов, которые не поддерживают идиому JSONP, вы все равно можете создать технику прокси (на бэкэнде), которая будет возвращать JSON reddit, а затем просто сделать запрос ajax к тому что.

Так что если вы позвонили http://mydomain.com/proxy.php?url=http://api.reddit.com:

<?php
$url = $_GET["url"];
print_r(file_get_contents($url));
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...