org.scalajs.dom.ext.ajax.post上的错误代码405

时间:2015-11-18 10:35:30

标签: javascript cross-domain scala.js

我正试图通过scalajs向我的(akka-http)后端发帖。

同样的电话是在邮递员工作,但是当我实际上从Chrome调用时失败 - scalajs

scalajs中的代码

ext.Ajax.post(<url>, <json>, headers = Map("Content-Type" -> "application/json"))

我在Chrome控制台中收到以下错误

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.

当我看一下邮递员的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);
});

如上所述,我可以从邮递员访问我的后端,不知道我在scalajs中缺少什么,我正在考虑crossDomain设置,但是如果 - 所以我不知道如何设置它在我的scalajs请求中。

可能有一些明显的解决方案。

此外,获取请求实际上正在运行

编辑:我正在添加后端部分akka-http路由器

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("..."){...

这是当前状态,所以我错过了什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这里发生的事情是,Chrome阻止您访问后端,因为:

  1. 后端服务器与JavaScript不同的域
  2. 后端服务器未明确允许您的JavaScript所在的域进行调用(这是Access-Control-Allow-Origin标头的含义)。
  3. Chrome(后端)因此会阻止请求。
  4. 由于此检查发生在前端/ chrome中,因此请求与邮递员的效果非常好。

    因此,要正确解决此问题,您应该配置akka-http以添加正确的Access-Control-Allow-Origin标头。

    如果您只是需要测试,可以使用标记--disable-web-security启动chrome。 非常小心,因为它会使您(作为互联网用户)容易受到CSRF和其他讨厌的忙碌影响。 不要始终使用此标记。