Access-Control-Allow-Origin不允许使用Origin’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=zh-CN&q=1DOP=?USD 。 Access-Control-Allow-Origin不允许原点’hostURL’。

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

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

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

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

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

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

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


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

从外观来看,这个API不支持JSONP (除非有一个未记录的参数),这是你在这种情况下跨域ajax请求的唯一选择,因为你不控制服务器而不能更改访问控制标头 。

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

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

crossDomain(默认值:对于同域请求为false,对于跨域请求为true)类型:Boolean如果要在同一域上强制执行跨域请求(如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/",