可能的CORS问题。发生了什么,我该如何解决?

时间:2015-08-19 10:54:55

标签: javascript ajax cors intermine

我正在使用异步请求加载查询数据来访问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

这很容易重现:

  1. 访问代码on one server (JSBin)。您应该获得成功的输出,说明查询返回的外显子数。
  2. 访问相同的代码on a different server (JSFiddle)。如果使用chrome,请确保关闭开发人员工具,因为他们倾向于为您清除缓存并可以防止错误发生。输出窗格应显示错误,直到您清除缓存并再次运行jsfiddle。
  3. 我非常确定有一些我需要启用的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]);
        });
      });
    

1 个答案:

答案 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