访问控制允许源不允许源'url'



我试图使用以下jquery(虚拟)代码获得Google Currency Calculator的货币汇率:

    $.getJSON("http://www.google.com/ig/calculator?hl=en&q=1" + "DOP" + "=?" + "USD",
        function(data) {
            $('.currNumber').each(function (index) {
                $(this).html(parseFloat($(this).html()) * 0.02681);
                                  });
          });

XMLHttpRequest无法加载http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD。Access-Control-Allow-Origin不允许访问'hostURL'。

在网站上,我发现了关于这个主题的各种主题,但他们大多是指本地文件访问,并试图通过使用附加参数启动chrome来解决它(我也在使用chrome),但这不是我的问题,这实际上似乎与跨域限制更相关。

所以,问题是:我如何使用jQuery从该url获得利率?

Ajax请求受到浏览器同源策略的限制。简而言之,这意味着您不能通过ajax直接与服务器通信,因为ajax与脚本运行的页面不在同一域中。所以,除非你正在为google.com开发一个页面,否则你不能直接与google.com对话。

对于这个限制有一些解决方法,包括插入脚本标签(通过脚本标签加载的JS文件不受同源策略的约束),然后使用JSONP回调将数据结果从这些脚本标签传递回主脚本。如果你尝试使用的API支持它,那么这可能就是你需要在这里做的。

jQuery将在这里帮助你很多,因为它可以自动将ajax调用转换为通过脚本标签加载的JSONP调用,并且可以在跨域情况下工作。根据jQuery文档的ajax函数,如果它在ajax调用的参数字符串中看到"callback="或者如果您设置了crossDomain选项,它将自动执行此操作。

编辑
我以为问题是什么很清楚,但似乎不是,所以这里开始了。您看到的这个错误是服务器限制您的域通过ajax请求访问它的资源。这是标准的JavaScript安全—您的脚本只能与它的源域通信。因为你的JavaScript没有从谷歌的域名加载,它不在允许通过ajax访问计算器API的域名列表中,这就是为什么你看到这个错误消息。

这里列出了使用jQuery进行跨域请求的选项。正如我前面提到的,JSONP只有在服务器支持它的情况下才会是一个有效的选项,因为它必须返回适当格式的JSON。

如果您提供指向您所引用的页面的链接,可能会有所帮助。

从表面上看,这个API不支持JSONP(除非有一个未记录的参数),在这种情况下,JSONP几乎是你跨域ajax请求的唯一选择,因为你不能控制服务器,也不能改变访问控制头。

您可能想要考虑构建一个服务器端资源,它将为您访问这个API,而不受JavaScript安全模型(如这里的PHP脚本)的约束。

似乎从这个链接- http://api.jquery.com/jQuery.ajax/-它是由jfriend00提供的-解释了一个参数,您可以在JQuery ajax请求中包含一个名为"crossDomain"的布尔值。

crossDomain(默认:同一域请求为false,跨域请求为true)类型:布尔如果希望在同一域中强制crossDomain请求(如JSONP),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域。(版本增加:1.5)

因此将其设置为true应该解决(?)这个问题。我不是专家,但我在不断遇到这个问题后尝试了它,它似乎解决了问题。

的例子:

$.ajax({ //my ajax request
        url: "_URL_I_AM_MAKING_REQUEST_TO_",
        type: "GET",
        cache: false,
        dataType: "json",
        **crossDomain: true,**
        data: { _mydata_
        success : function(response){}
});

小提示

我得到了这个问题,因为我得到了这个错误,试图发布到我自己的服务器。

解决方案:确保在ajax调用主机名匹配。

例子:

//This failed
$.post("http://domain.com/index.php/count/",
//This succeeded (the page this was called from was www.domain.com/.....)
$.post("http://www.domain.com/index.php/count/",

相关内容

  • 没有找到相关文章

最新更新