我正在为我儿子的Wordpress网站做一些javascript / jQuery编程,我通常喜欢在我的家用电脑而不是在线网站上进行测试。他的网站始终假定他的域名,因此为了测试,我在我的hosts文件中创建条目以将他的域名重定向到我的localhost。
但是,我正在尝试为Yahoo finance api测试json回调,并且我收到有关跨源资源共享的错误。雅虎显然对我的主机文件一无所知,所以它收到我的请求,告诉它将结果发送到另一个域。
我不确定在我的本地系统上启用CORS是否有帮助,尽管我尝试过这样做。这可能是我错了,它应该工作,也许我错误地启用它,但我怀疑我需要在他的真实服务器上启用它(在GoDaddy上),我怀疑他们是否愿意这样做。
有谁知道如何解决这个问题?如果没有相当简单的解决方案,我想我会在实时服务器上进行测试,并且只使用未发布的页面进行测试,这应该是非常无害的。
修改
我想我现在明白了发生了什么。我的理解是,通过将网站重定向到不同的地址(或类似的地址),这可以保护我免受网站拦截我请求的数据的影响。
根据要求,这是我的测试代码:
var data = encodeURIComponent('select from yahoo.finance.quotes where symbol in ("GOOG")&env=http://datatables.org/alltables.env&format=json');
var url = 'http://query.yahooapis.com/v1/public/yql ';
jQuery.getJSON(url, 'q=' + data, callback);
我的回调函数永远不会被调用,所以这里没有关系。我可以将整个网址粘贴到Firefox或Chrome的地址栏中,然后无误地恢复数据,所以我知道这是正确的。
我按照Maximillian Laumeister的建议尝试了命令行“google-chrome --disable-web-security”,并在控制台中出现了此错误:
XMLHttpRequest cannot load http://query.yahooapis.com/v1/public/yql%20?q=select%20%20from%20yahoo.fina…OG%22)%26env%3Dhttp%3A%2F%2Fdatatables.org%2Falltables.env%26format%3Djson. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.wenboinvestment.com' is therefore not allowed access. The response had HTTP status code 404.
(他的网站是wenboinvestment.com )
答案 0 :(得分:2)
您的错误是由您的浏览器强制执行Same-Origin Policy引起的,这会阻止网页访问其他域中的资源,除非满足一组特定的条件。
绕过跨源资源共享错误的一种方法是在浏览器中临时禁用同源策略。对于Google Chrome,请使用--disable-web-security
命令行参数运行Chrome。这将禁用Chrome中的同源策略,这意味着您可以从所需的任何域加载跨域。 (当然,不要通过这些检查来浏览整个互联网,他们会因为某种原因而在那里。)
以下是如何操作的:
在Windows中:
创建Chrome的快捷方式。右键单击它,单击"属性"并添加:
--disable-web-security
到目标"字段。
在Mac OS / Linux中:
打开命令提示符并运行:
google-chrome --disable-web-security
有关详细信息,请参阅this Stack Overflow answer。
关于你的第二个错误,你的查询只是格式错误(你正在编写GET参数和你的查询字符串,而要正常工作,他们需要取消编码)。以下是演示修复查询的示例:
var data = encodeURIComponent("select * from yahoo.finance.quotes where symbol in ('GOOG')");
var url = 'http://query.yahooapis.com/v1/public/yql';
jQuery.getJSON(url, 'q=' + data + '&env=http://datatables.org/alltables.env&format=json', callback);
function callback(xhr) {
console.log(xhr);
}
在Chrome中运行this JSFiddle,它应该如下所示(您可以看到打印到控制台的AJAX结果):
事实证明,当你有一个正确形成的查询时,雅虎设置了正确的服务器头,所以如果你只是使用YQL,你甚至不需要使用{{1诀窍。