【问题标题】:POST Request Not Recognizing HeadersPOST 请求无法识别标头
【发布时间】:2019-12-18 14:45:43
【问题描述】:

我正在尝试向我设置的 AWS Lambda Python 脚本发出 POST 请求。

我已经听说过通过在来自 AWS lambda 的响应中添加一个标头来解决 Access-Control-Allow-Origin 的问题,看起来像 Access-Control-Allow-Origin:*,我在我正在为 get 请求编写的代码中实现了这一点。然后当我开始创建 POST 请求时,我做了同样的事情,所以新的 POST 请求最初看起来像这样:

def post(event, context):
    try:
        return dict(
            statusCode=200,
            headers= {'Access-Control-Allow-Origin': "*"},
            body="test"
        )
    except Exception as ex:
        return dict(
            statusCode=500,
            body=str(ex)
        )

这很有效,在 Chrome 的网络选项卡中,我看到我们传递了一个发布请求并且没有问题,并且标头被正确识别,允许跨域调用。但这几乎只是我已经设置和工作的 GET 请求。因此,当我将其更新为更类似于 POST METHOD 并执行我想要的问题时。

所以我想在 POST 请求中执行的代码很简单,我应该能够像这样发出请求,

def post(event, context):
    try:
        result=str(event.get("inputOne") + event.get("inputTwo"))
        return dict(
            statusCode=200,
            headers= {'Access-Control-Allow-Origin': "*"},
            body=result
        )
    except Exception as ex:
        return dict(
            statusCode=500,
            body=str(ex)
        )

当我在 AWS Lambda 管理控制台中对此进行测试时,我的代码工作正常,并且我在正文中得到了预期的响应。

但是当我尝试从我的 React 站点调用 POST 端点时,我再次收到错误:

Access to XMLHttpRequest at 'THE_POST_URL' from origin     
'http://localhost:XXX' has been blocked by CORS policy: No 'Access-   
Control-Allow-Origin' header is present on the requested resource. 

因此,由于某种原因,当 body 变量不仅仅是像 "this" application/json;charset=UTF-8 而我的请求只接受(正如它在 dev-tools 中所说)application/json 但是,即使尝试添加标头以接受这种内容类型的格式,我仍然遇到同样的问题。

我不完全确定为什么标头适用于 GET 请求,但不适用于 POST 请求,希望有人能帮助教我,谢谢!

编辑:我也尝试将'Access-Control-Allow-Methods': "OPTIONS,GET,POST" 添加到帖子响应的标题中,但这也不起作用。

【问题讨论】:

  • I believe this has to do with the Content-Type in the request being of the form application/json;charset=UTF-8 - 是的,使用该标头,浏览器将发出 OPTIONS 预检请求,我很惊讶您没有在浏览器控制台中看到此信息 - 请参阅 developer.mozilla.org/en-US/docs/Web/HTTP/… 了解有关信息这个 OPTIONS 预检
  • 是的,我在控制台中没有看到任何关于 OPTIONS 的信息。我已经阅读了你给我的那个链接,所以根据我的理解,我是否必须在标题中添加类似Access-Control-Allow-Methods 的内容?
  • @JaromandaX — 错误消息显示“requested resource”而不是“preflight request”
  • @Quentin - 正如我在评论中所说,我很惊讶你没有在浏览器控制台中看到这个,因为应用程序/json 的内容类型应该触发 CORS 预检
  • @JaromandaX — 这表明预检正在通过而实际请求失败。

标签: javascript post aws-lambda http-post axios


【解决方案1】:

因此,在阅读了有关我的问题的 cmets 后,我认为值得深入研究一下我在 AWS 上设置 API 网关和 Lambda 服务的方式。

我开始使用 curl 实用程序来尝试从终端实用程序测试我的调用后,发现它也失败了,但我能够使用 CloudWatch 调试问题并最终解决工作。

我的 curl 请求遇到的问题是我没有正确格式化 JSON 输入,但即使我是 Lambda 也没有正确转换事件,没有像预期的那样产生 Dict。

可以看到我使用的 curl 调用:

curl -X POST  https://myURL.execute-api.myREGION.amazonaws.com/stage/yourPOST \
-d '{"inputOne":80000,"inputTwo":85}'

但为了正确读取该输入,然后使用它,我必须更新我在 Lambda 中的代码以反映正确解析输入,这个更新的 lambda 代码可以在这里找到。您传递给此 lambda 的 event 对象是 DICT 对象,因此在第一行,我们使用 JSON.loads 将事件的“body”值解码为我们存储为 @987654327 的字典@。然后获取这两个属性的值,我们使用命令body.get("yourKey")

def yourPOST(event, context):

    body=json.loads(event["body"])
    a=body.get("inputOne")
    c=body.get("inputTwo")

进行这些更改后,来自我的 React 站点的调用可以正常工作!如果有人有任何问题,请随时发表评论,希望对您有所帮助!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2020-04-07
  • 2023-01-05
  • 2013-02-19
  • 2021-11-16
  • 1970-01-01
  • 2020-01-21
  • 2018-12-10
相关资源
最近更新 更多