jQuery + JSONP + Yahoo Query Language - PullRequest
       12

jQuery + JSONP + Yahoo Query Language

4 голосов
/ 25 июня 2010

Я хочу получить реальные курсы валют из внешнего источника, поэтому я нашел этот замечательный веб-сервис:

Конвертор валют

Этот сервис работает как шарм,Единственным недостатком является то, что он не предоставляет результаты JSONP, только XML.Поэтому у нас возникла проблема с несколькими браузерами при попытке использовать этот веб-сервис с помощью jQuery $ .ajax ().

Итак, я обнаружил Yahoo Query Language , который возвращает результаты в виде JSONP, а также манги для использования другимивеб-сервисы и верните мне результаты.Это также работает, вот пример URL:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&diagnostics=true&callback=cbfunc

Этот URL возвращает результат JSONP и работает как шарм, но проблема возникает, когда я использую это в своем коде:

       $.ajax({
            type: "GET",
            url: urlToWebservice,
            contentType: "application/json; charset=utf-8",
            dataType: "jsonp",
            success: function(data) {
                $("#status").html("OK: " + data.text);
            },
            error: function(xhr, textStatus, errorThrown) {
                $("#status").html("Unavailable: " + textStatus);
            }
        });

Когда я пытаюсь запустить этот код, ничего не происходит, и я вижу это сообщение об ошибке в моем отладчике javascript в Firebug:

cbfunc is not defined

cbfunc - это имя контейнера, который окружает ответ JSON, но почемуон говорит не определено?

РЕДАКТИРОВАТЬ:

Это мой новый код, но я все еще получаю cbfunc is not defined

        $.ajax({
            url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&callback=cbfunc",
            dataType: 'jsonp',
            jsonp: 'callback',
            jsonpCallback: 'cbfunc'
        });
        function cbfunc(data) {
            alert("OK");
        }

Исообщение "ОК" никогда не запускается ...

Ответы [ 4 ]

5 голосов
/ 25 июня 2010

Если доступно, используйте параметр jsonpCallback при вызове $.ajax, например:

 jsonpCallback: "cbfunc",

Его описание из документов jQuery API гласит:

Укажите имя функции обратного вызова для запроса jsonp. Это значение будет использоваться вместо случайного имени, автоматически сгенерированного jQuery.

Документы позже говорят:

Желательно, чтобы jQuery генерировал уникальное имя, поскольку это облегчит управление запросами и обеспечит обратные вызовы и обработку ошибок. Возможно, вы захотите указать обратный вызов, если хотите улучшить кэширование запросов GET в браузере.

Однако не рекомендуется использовать это "предпочтительное" поведение при использовании YQL. Почему этот подход не является идеальным, может сделать этот ответ слишком многословным, поэтому вот ссылка (из блога YQL), подробно описывающая проблемы с предпочтительным подходом jQuery, использующая jsonpCallback и т. Д .: Как избежать ограничения скорости и получить бан в YQL и Pipes: Кэширование - ваш друг

2 голосов
/ 25 июня 2010

Причина, по которой он не работает, заключается в том, что, указав callback=cbfunc в строке запроса, генерируется URL-адрес типа:

http://query.yahooapis.com/...&callback=cbfunc&callback=jsonp1277417828303

Удаляет все неинтересные части, но URL-адрес содержит два callback параметра.Один из них управляется jQuery, а другой нет.YQL просматривает только первый параметр callback и возвращает обернутый вокруг него ответ.

cbfunc({"query":{...}});

Однако в вашем сценарии нет функции с именем cbfunc, поэтому вы получаете неопределенную ошибку,jQuery создал неявную функцию с именем jsonp1277417828303 в приведенном выше примере, и вместо этого ответ от YQL должен был быть:

jsonp1277417828303({"query":{...}});

, чтобы jQuery воздействовал на нее, и возвращал ответ на ваш success обратный вызовчто он никогда не должен был делать.

Итак, как предложил @SLaks, удалите &callback=cbfunc из вашего URL или замените его на &callback=?, чтобы позволить jQuery обрабатывать вещи.

См. рабочий пример .

2 голосов
/ 25 июня 2010

Вы должны позволить jQuery обрабатывать обратный вызов, изменив urlToWebservice на callback=?

1 голос
/ 11 июля 2010

Вы определенно должны попробовать jQuery-JSONP: http://code.google.com/p/jquery-jsonp/

Упрощает все:)

...