我正在使用异步请求加载查询数据来访问REST Web服务。当我在不同的服务器上运行相同的代码时(例如,我在本地开发然后访问Web上的实时版本),AJAX请求将失败。清除缓存,刷新页面,它将起作用。
失败后我得到的错误(从Chrome控制台复制/粘贴,也发生在FF中)是:
XMLHttpRequest cannot load http://www.flymine.org/query/service/model?format=json. The 'Access-Control-Allow-Origin' header has a value 'http://fiddle.jshell.net' that is not equal to the supplied origin. Origin 'http://null.jsbin.com' is therefore not allowed access. im.js:129
Uncaught TypeError: Cannot read property 'content-type' of undefined http://www.flymine.org/query/service/summaryfields?format=json.
The 'Access-Control-Allow-Origin' header has a value 'http://fiddle.jshell.net' that is not equal to the supplied origin.
Origin 'http://null.jsbin.com' is therefore not allowed access. im.js:129
Uncaught TypeError: Cannot read property 'content-type' of undefined
这很容易重现:
我非常确定有一些我需要启用的CORS-ey,但我并不完全确定它可能是什么。我有权根据需要修改服务器标头等,以防止出现此问题。
有一个图书馆IMJS,负责沟通的大部分工作,但这里是连接的基本代码:
var flymine = new imjs.Service({root: 'www.flymine.org/query'});
var query = {
from: 'Gene',
select: [
'exons.symbol',
'chromosome.primaryIdentifier',
'exons.chromosomeLocation.start',
'exons.chromosomeLocation.end'
],
where: {
symbol: 'eve',
organism: {lookup: 'D. melanogaster'}}
};
flymine.rows(query).then(function(rows) {
console.log("No. of exons: " + rows.length);
rows.forEach(function printRow(row) {
console.log("[" + row[0] + "] " + row[1] + ":" + row[2] + ".." + row[3]);
});
});
答案 0 :(得分:3)
错误消息几乎为您解释了问题:
XMLHttpRequest无法加载http://www.flymine.org/query/service/model?format=json。
您尝试访问的服务器是www.flymine.org
“Access-Control-Allow-Origin”标头的值为“http://fiddle.jshell.net”
www.flymine.org
表示允许http://fiddle.jshell.net
从中读取数据。
www.flymine.org
通过在响应中添加Access-Control-Allow-Origin
标头来实现此目的。
不等于提供的原点。因此,不允许原点“http://null.jsbin.com”访问。 im.js:129
您是从http://null.jsbin.com
而非http://fiddle.jshell.net
提出请求的。
您需要更改www.flymine.org
,以便它允许http://null.jsbin.com
。