jQuery + JSONP + Yahoo查询语言

时间:2010-06-24 21:14:38

标签: javascript jquery json web-services jsonp

我想从外部来源获得实时汇率,所以我找到了这个很棒的网络服务:

Currency Convertor

这项服务就像一个魅力,唯一的缺点是它不提供JSONP结果,只提供XML。因此,在尝试使用jQuery $ .ajax()来使用此Web服务时,我们遇到了跨浏览器问题。

所以我发现Yahoo Query Language以JSONP和mangae的形式返回结果以使用其他Web服务并返回结果。这也有效,这是一个示例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

此网址返回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);
            }
        });

当我尝试运行此代码时,没有任何反应,我可以在我的Firebug javascript调试器中看到此错误消息:

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");
        }

并且“OK”消息永远不会被触发......

4 个答案:

答案 0 :(得分:5)

如果可用,请在jsonpCallback的调用中使用$.ajax参数,如:

 jsonpCallback: "cbfunc",

其描述来自jQuery API docs

  

指定jsonp请求的回调函数名称。将使用此值代替jQuery自动生成的随机名称。

文档后来继续说:

  

最好让jQuery生成一个唯一的名称,因为它可以更容易地管理请求并提供回调和错误处理。如果要为GET请求启用更好的浏览器缓存,可能需要指定回调。

然而, 建议在使用YQL时使用这种“首选”行为。正是为什么这种方法不理想可能会使这个答案过于冗长,所以这里有一个链接(来自YQL博客),详细说明jQuery首选方法的问题,利用jsonpCallback等等:{{3} }

答案 1 :(得分:2)

您应该让jQuery通过将urlToWebservice更改为callback=?

结束来处理回调

答案 2 :(得分:2)

它不起作用的原因是因为通过在查询字符串中指定callback=cbfunc会生成类型的URL:

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

删除了所有不感兴趣的部分,但该网址包含两个callback个参数。其中一个是由jQuery管理的,另一个不是。 YQL只查看第一个callback参数,并返回一个响应该参数。

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

但是,脚本中没有名为cbfunc的函数,因此这就是您收到未定义错误的原因。 jQuery在上面的例子中创建了一个名为jsonp1277417828303的隐式函数,而YQL的响应应该是:

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

让jQuery对其采取行动,并将响应返回到你永远不会做的success回调。

因此,正如@SLaks建议的那样,从您的网址中删除&callback=cbfunc,或将其替换为&callback=?以让jQuery处理事情。

查看working example

答案 3 :(得分:1)

你一定要试试jQuery-JSONP:http://code.google.com/p/jquery-jsonp/

简化一切:)