Access-Control-Allow-Origin不允许使用origin'url'

时间:2011-08-27 17:11:05

标签: jquery json cross-domain

我正在尝试使用以下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不允许使用origin'hostURL'。

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

所以,问题是:如何使用jQuery从该网址获取费率?

4 个答案:

答案 0 :(得分:17)

Ajax请求受浏览器Same Origin Policy的限制。简而言之,这意味着您无法通过与运行脚本的页面不在同一域中的ajax直接与服务器通信。因此,除非您正在为google.com开发页面,否则无法直接与google.com交谈。

这种限制的解决方法涉及插入脚本标记(通过脚本标记加载的JS文件不受相同的原始策略约束),然后使用JSONP回调将数据结果从这些脚本传回主脚本标签。如果您尝试使用的API支持它,那么您可能需要执行此操作。

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

答案 1 :(得分:2)

修改
我觉得很清楚问题是什么,但似乎可能不是这样。您看到的这个错误是服务器限制您的域通过ajax请求访问它的资源。这是standard JavaScript security - 您的脚本只能与其源自的域进行通信。由于您的JavaScript未从Google的域中加载,因此它不在允许通过ajax访问计算器API的域列表中,这就是您看到此错误消息的原因。

使用jQuery进行跨域请求的选项为outlined here。正如我之前提到的,如果服务器支持它,JSONP将只是一个有效选项,因为它必须发回适当格式化的JSON。


如果您提供了指向您所指的网页的链接,这可能会有所帮助。

从外观来看,这个API不支持JSONP(除非有一个未记录的参数),这是你在这种情况下跨域ajax请求的唯一选择,因为你没有控制服务器,无法更改access control headers

您可能需要考虑构建一个服务器端资源,以便为您访问此API,而不受the PHP script here等JavaScript安全模型的限制。

答案 2 :(得分:2)

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

crossDomain(对于同域请求,默认值为false,对于跨域请求,则为true) 类型:布尔值 如果要在同一域上强制执行跨域请求(例如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){}
});

答案 3 :(得分:1)

小额外信息。

我遇到了这个问题,因为我在尝试发布到自己的服务器时出现此错误。

解决方案:确保主机名在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/",