Получение значения JSON с помощью jQuery getJSON - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь получить значение json с помощью метода getJSON.

var myurl = 'http://otherdomain.com/api.json?value=something&callback=?';
$.getJSON(myurl,function(data){
    console.log('successful!');
}).error(function(){
    console.log('Error message: ' + e.statusText);
});

Конечный результат: Сообщение об ошибке: успех вместо данных json, хотя сетевой ответ показывает данные json в консоли разработчика.Например, данные ответа:

[{"First": "John", "FirstLength": [4], "Last": "Doe", "LastLength": [3]}]

Если я открою ссылку прямо из браузера, она загрузится нормально.

Если я удалю & callback =?Я получаю это сообщение:

XMLHttpRequest не может загрузить http://otherdomain.com/api.json?value=something. Источник http://localhost не разрешен Access-Control-Allow-Origin.

Какие еще есть варианты, чтобы избежать этой проблемы?Спасибо

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Я изначально ответил на этот вопрос, полагая, что URL был недействительным из-за второго '?'персонаж.С момента привлечения отрицательного голоса я осознаю свою ошибку и то, что это стандартный синтаксис JSONP для использования случайно сгенерированного имени функции обратного вызова от JQuery.

Поэтому я провел небольшое исследование, чтобы наверстать упущенное в моем первоначальном посте, и у меня есть некоторые идеи.для вас.

Данные ответа, которые вы упомянули [{"First":"John","FirstLength":[4],"Last":"Doe","LastLength":[3]}], являются действительными JSON из того, что я вижу.Однако согласно этому сообщению о Ошибка с json4j похоже, что некоторые библиотеки могут неправильно обрабатывать ваш ответ, начиная с квадратной скобки.Ваша проблема исчезнет, ​​если вы уберете начальные и конечные квадратные скобки, чтобы вы возвращали один объект javascript в функцию обратного вызова, а не массив?

Из прочтения следующих двух превосходных постов похоже, что вы неполучить стандартную обработку ошибок JQuery, которую вы обычно получаете (как вы описали)

http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery-and-php/

Поскольку JSONP опирается на тег script, он не использует функции обратного вызова избазовый объект HTTPRequest.Это означает, что при использовании JSONP успех, неудача, полные функции обратного вызова в методе $ .ajax () не имеют значения и не работают.

http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

Во-первых, обработка вызовов JSONP не связана с ошибками.Если динамическая вставка скрипта работает, вас вызывают;если нет, ничего не происходит.Он просто молча терпит неудачу.

Из этих постов я предлагаю еще одно предложение - явно указать, что dataType возвращается как JSONP.$.ajax в JQuery может вести себя иначе, чем $.json.Поэтому попробуйте использовать явную функцию обратного вызова, как это ...

$.ajax({
   url: surl,
   data: {id: id},
   dataType: "jsonp",
   jsonp : "callback",
   jsonpCallback: "jsonpcallback"
   });

Это последнее предложение требует JQuery 1.4 +

0 голосов
/ 12 декабря 2011

что-то вроде этого делает:

function fetch_feed(url){
        var newScript = document.createElement('script');
        newScript.type = 'text/javascript';
        newScript.src = url;
        jQuery('body').append(newScript);
    }

function successMethod(data){
    console.log('successful!');
}

fetch_feed("http://otherdomain.com/api.json?value=something&callback=successMethod");
0 голосов
/ 12 декабря 2011

Я могу ошибаться здесь ... но вы знаете, что вызываете метод jQuery.error ... так как вы сами генерируете сообщение об ошибке, не обрабатывая обратный вызов ошибки на вашем getJson.

...