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

error code 405 on org.scalajs.dom.ext.ajax.post

本文关键字:错误代码 post ajax scalajs dom ext org      更新时间:2023-09-26

我正试图从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阻止您访问后端,因为:

  1. 后端服务器与您的JavaScript位于不同的域上
  2. 后端服务器不明确允许JavaScript所在的域进行调用(这就是Access-Control-Allow-Origin标头的含义)
  3. Chrome(而不是后端)因此阻止了该请求

由于此检查发生在前端/chrome中,因此该请求与poster配合得非常好。

因此,为了正确修复此问题,您应该配置akka-http以添加正确的Access-Control-Allow-Origin标头。

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