我正试图从scalajs对我的(akka-http)后端进行post调用。
同样的呼叫在poster中工作,但当我实际从chrome-scalajs 呼叫时失败了
scalajs 中的代码
ext.Ajax.post(<url>, <json>, headers = Map("Content-Type" -> "application/json"))
我在铬控制台中得到以下错误
XMLHttpRequest cannot load <url>. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 405.
当我在poster中查看javascript的代码(生成代码片段)时,我看到了以下
var settings = {
"async": true,
"crossDomain": true,
"url": <url>,
"method": "POST",
"headers": {
"content-type": "application/json",
"cache-control": "no-cache",
"postman-token": "273f35c9-1d2a-12d8-30d6-8523d479869e"
},
"processData": false,
"data": <json>
}
$.ajax(settings).done(function (response) {
console.log(response);
});
如前所述,我可以从poster访问我的后端,不确定scalajs中缺少什么,我在考虑crossDomain
设置,但如果是这样,我不知道如何在scalajs请求中设置它。
可能有一些显而易见的解决方案。
同样,get请求实际上正在工作
编辑:我正在添加后端部分akkahttp路由器
respondWithHeaders(`Access-Control-Allow-Origin`.*, `Access-Control-Allow-Methods`(HttpMethods.GET, HttpMethods.POST),
`Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Authorization")) {
pathPrefix("..."){...
这是目前的状态,所以我缺少什么?
谢谢你的帮助。
这里发生的事情是,chrome阻止您访问后端,因为:
- 后端服务器与您的JavaScript位于不同的域上
- 后端服务器不明确允许JavaScript所在的域进行调用(这就是
Access-Control-Allow-Origin
标头的含义) - Chrome(而不是后端)因此阻止了该请求
由于此检查发生在前端/chrome中,因此该请求与poster配合得非常好。
因此,为了正确修复此问题,您应该配置akka-http以添加正确的Access-Control-Allow-Origin
标头。
如果您只需要测试,您可以使用标志--disable-web-security
启动chrome。请非常小心,因为这会让你(作为互联网用户)容易受到CSRF和其他讨厌的忙碌的影响请勿始终使用此标志。