【问题标题】:Cross-domain requests with JQuery using YQL使用 YQL 的 JQuery 跨域请求
【发布时间】:2010-07-08 18:26:01
【问题描述】:

所以我需要发出一个跨域请求,其中响应不是 JSON 格式的,所以我不能使用 .getJSON。 .get 显然不起作用,因为它是一个跨域请求。

我在谷歌搜索时遇到了这个 (Read this),它似乎应该适用于我想做的事情(即使用 jquery 插件进行非 json 格式的跨域调用)。我的代码如下所示。我知道 url 工作正常,因为如果我将它粘贴到浏览器中,我可以看到响应,根据 last.fm 文档

服务器响应的正文 由一系列 \n (ASCII 10) 终止的行。一个典型的成功者 服务器响应将类似于 这个:

OK
17E61E13454CDD8B68E8D7DEEEDF6170
http://post.audioscrobbler.com:80/np_1.2
http://post2.audioscrobbler.com:80/protocol_1.2

所以我知道我的网址没问题。现在我想知道我是如何获得这些信息的,以及为什么我的他们的示例版本不起作用。

function performHandshake(sk, token, ts){

    var token = md5(apiSecret + ts);
    var urlToUse = "http://post.audioscrobbler.com/?hs=true&p=1.2.1&c=tst&v=1.0&u=chamals&t=" + ts + "&a=" + token + "&api_key=" + apiKey + "&sk=" + sk + "&format=xml&callback=cbfunc";
            $('#container').load(urlToUse);
    $.ajax({
        url: urlToUse,
        type: 'GET',
        success: function(res){
            var headline = $(res.responseText).find('a.tst').text();
            window.console.log(headline);   
        }   
    });

}

【问题讨论】:

    标签: javascript jquery cross-domain yql


    【解决方案1】:

    您链接的页面谈到使用 YQL 和 jQuery。这是一个非常有趣的解决方案。但是,您的示例似乎跳过了 YQL 部分(这很重要)。

    var urlToUse = "http://post.audioscrobbler.com/?hs=true&p=1.2.1&c=tst&v=1.0&u=chamals&t=" + ts + "&a=" + token + "&api_key=" + apiKey + "&sk=" + sk + "&format=xml&callback=cbfunc";
    
    var yqlUrl2Use = "http://query.yahooapis.com/v1/public/yql?"+
                "q=select%20*%20from%20html%20where%20url%3D%22"+
                encodeURIComponent(urlToUse)+
                "%22&format=xml'&callback=?"
        // this function gets the data from the successful 
        // JSON-P call
    

    然后你必须调用新 URL 作为 JSONP 请求...

    $.getJSON(yqlUrl2Use, function(json){
        // figure out the format of the answer here...   
    });
    

    【讨论】:

      【解决方案2】:

      是的,跨浏览器脚本。你不能 AJAX 任何类似的东西,因为它违反了相同的域策略。

      您将不得不在运行 JavaScript 的同一台服务器上设置代理。

      编辑看起来你需要$('#container').load(url) 位才能工作。

      返回并仔细阅读链接的文章。

      【讨论】:

      • 抱歉,我刚才讨论的页面的链接已损坏,但现在已修复james.padolsey.com/javascript/cross-domain-requests-with-jquery
      • 这是不正确的拜伦。您可以跨域执行 ajax 请求,但只能使用 $.getJSON()
      • @HurnsMobile,我更新了我的答案以更清楚。 $.json 实际上只是动态地做一些<script src=''> 的东西并返回结果。
      • .load 中的 url 应该是什么?我的网址?我不能真正关注它,因为他们只是把谷歌。我尝试输入我的网址,但它仍然不起作用。
      【解决方案3】:

      你需要使用$.getJSON而不是$.ajax()来返回跨站信息。

      【讨论】:

      • 这不适用于简单的字符串。来自您的链接文章:Important: As of jQuery 1.4, if the JSON file contains a syntax error, the request will usually fail silently.
      • 我认为 $.getJSON 仅在请求以 JSON 格式返回但我的请求不是时才有效
      【解决方案4】:

      var res 实际上有我需要的信息。我猜他们的标题 = 部分是专门为他们的实施而设计的。

      感谢帮助的人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2011-04-06
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        相关资源
        最近更新 更多