跨域AJAX请求与西纳特拉不工作 - 发送JSON与jQuery.ajax

问题描述:

在我的服务器我的末日的应用程序,我有以下设置:跨域AJAX请求与西纳特拉不工作 - 发送JSON与jQuery.ajax

before do 
    headers 'Access-Control-Allow-Origin' => '*', 
      'Access-Control-Allow-Methods' => ['OPTIONS', 'GET', 'POST'], 
      'Access-Control-Allow-Headers' => ['Content-Type', 'Accept', 'X-Requested-With', 'access_token'] 

    env['rack.errors'] = error_logger 
end 

在我的前端应用程序,我执行以下HTTP请求:

$.ajax({ 
     type: "POST", 
     url: "http://findaspot.multimediatechnology.at/api/", 
     data: json, 
     dataType: "json", 
     success: function (data) { 
      console.log('Success!'); 
      console.log(data); 
     }, 
     error: function(xhr, status, error) { 
      var err = eval("(" + xhr.responseText + ")"); 
      alert(err.Message); 
     } 
    }) 

我总是收到此错误信息:

XMLHttpRequest cannot load http://findaspot.multimediatechnology.at/api/. Invalid HTTP status code 404 

错误有事情做与预检OP TIONS请求到服务器 - 因为我正在发送JSON - 我已经尝试将jQuery.ajax选项“异步”设置为false - 也没有工作。

到目前为止,我没有任何想法如何解决这个问题。如果你们能帮助我,那会很好。

+0

我的理解是,头部Access-Control-Allow-Origin应该由您向其提出请求的主机提供,而不是由客户端发出XHR请求。另一种选择是让他们启用CORS并将引用者设置为您的域名,并且他们必须设置CORS以允许您的域名拨打电话。 – Phobos 2014-11-26 09:32:52

您正面临着这两个问题之一。

  1. 错误告诉你404,所以在Sinatra中你还没有创建一个路由(控制器),该路由采用该URL的OPTIONS方法,404错误是正确的。

您可以指定在你创建GET,POST,PUT,DELETE路线以同样的方式这条路线,但你也可以在你的before滤波器集成这样的:

# return directly with 200 if request method is options 
halt 200 if request.request_method == 'OPTIONS' 

这将批准所有200 OK传入OPTIONS请求。不会再有404了。这不是一个安全问题,因为你定义了允许以CORS方式请求API的源。

  1. 您的问题很可能是第一个提到的问题,但您以后也会面对这个问题。

在CORS世界一些HTTP动作原点(Access-Control-Allow-Origin)不能被设置到任何主机(*)。

可以通过指定像这样正确的起源解决这个问题:

'Access-Control-Allow-Origin' => 'https://the.url.sending.requests.to.the.api' 

通常你想从不同的来源打电话给你的API,因为你有不同的环境(开发,测试,阶段,生产)。要将其归档,您需要一些代码,将允许的来源设置为请求的环境。 但是看看,不要做任何事情,让一切!

一种可能的方法是在您的应用程序配置中手动定义允许的来源。当CORS请求进入时,如果请求是从您信任的一个起源发送的,请检查before过滤器,并将其设置为Access-Control-Allow-Origin