跨域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 - 也没有工作。
到目前为止,我没有任何想法如何解决这个问题。如果你们能帮助我,那会很好。
答
您正面临着这两个问题之一。
- 错误告诉你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的源。
- 您的问题很可能是第一个提到的问题,但您以后也会面对这个问题。
在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
。
我的理解是,头部Access-Control-Allow-Origin应该由您向其提出请求的主机提供,而不是由客户端发出XHR请求。另一种选择是让他们启用CORS并将引用者设置为您的域名,并且他们必须设置CORS以允许您的域名拨打电话。 – Phobos 2014-11-26 09:32:52