【问题标题】:Cross domain AJAX not working, even with wildcard origin跨域 AJAX 不起作用,即使使用通配符来源
【发布时间】:2013-10-31 10:07:16
【问题描述】:

在我的网站http://bitalarm.com 上,我正在尝试通过他们的 API 将 Bitstamp 价格与来自客户端的 Javascript 请求集成。我一直收到这个错误:

XMLHttpRequest cannot load http://www.bitstamp.net/api/ticker/. Origin http://bitalarm.com is not allowed by Access-Control-Allow-Origin.

我在运行比特币警报的 Sinatra 应用程序中更改了我的标题,以将 Access-Control-Allow-Origin 设置为通配符。我知道这是因为 curl 设置的:

$curl -I http://bitalarm.com
HTTP/1.1 200 OK 
Content-Type: text/html;charset=utf-8
Access-Control-Allow-Origin: *
Content-Length: 2253
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-08-29)
Date: Thu, 31 Oct 2013 01:39:08 GMT
Connection: Keep-Alive

不幸的是,我仍然收到错误消息。我应该更改标题的其他部分以使其正常工作吗?

这是访问该 API 的 javascript。它只是一个带有 jQ​​uery 的 GET 请求。

url: 'http://www.bitstamp.net/api/ticker/',

getPrice: function(callback){
    $.get(app.api.bitstamp.url, function(data){
    callback({
        value: data.data.last_local.value,
        display: data.data.last_local.display
    });
});

【问题讨论】:

  • 你能在你发出 ajax 请求的地方显示 javascript 吗?

标签: javascript ruby ajax sinatra


【解决方案1】:

API 站点 (www.bitstamp.net) 没有设置 Access-Control-Allow-Origin 标头。

您提供的 CURL 示例是对您网站的请求;对 bitstamp 站点的请求,而对 bitstamp 的实际 CURL 请求显示稍有不同:

$ curl -I http://www.bitstamp.net/api/ticker/
HTTP/1.1 302 Found
Date: Thu, 31 Oct 2013 01:58:04 GMT
Server: Apache
Location: https://www.bitstamp.net:443/api/ticker/
Connection: close
Content-Type: text/html; charset=iso-8859-1
Set-Cookie: incap_ses_156_99025=nashNbLsX1Eg32pAgDkqAiy5cVIAAAAAz1umCC4nKSJlj6EdKqS70w==; path=/; Domain=.bitstamp.net
Set-Cookie: visid_incap_99025=A7ePN/kMSnWVCoZjb2CgRSu5cVIAAAAAQUIPAAAAAABYCnOINrGBVtDw+Rx+PQs1; expires=Fri, 30 Oct 2015 08:44:52 GMT; path=/; Domain=.bitstamp.net
X-Iinfo: 11-97249264-97249266 NNNY CT(123 -1 0) RT(1383184683823 1) q(0 0 1 1) r(2 2) U6
X-CDN: Incapsula

注意这里没有设置Access-Control-Allow-Origin,这意味着浏览器不允许请求通过。

我假设您无权访问 bitstamp.net 服务器,在这种情况下,您需要使用服务器端代理通过 ajax 获取数据。我从您的示例 CURL 请求中猜测您的服务器端代码是用 Ruby 编写的,so this Ruby example may be helpful towards implementing such a proxy

【讨论】:

    【解决方案2】:

    您正在尝试从另一个域 http://www.bitstamp.net/ 访问 API,因此您的域 http://bitalarm.com 应该在 API 服务器中列入白名单。

    请检查 API 服务器中的配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2014-04-18
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多