POST 请求无法识别 Headers

POST Request Not Recognizing Headers

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

我已经听说通过在 AWS lambda 的响应中添加一个 header 来解决 Access-Control-Allow-Origin 的问题,看起来像 Access-Control-Allow-Origin:*,我在代码中实现了这个我正在处理获取请求。然后当我开始创建一个 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 的 Network-Tab 中,我看到我们传递了一个 post 请求并且没有问题,并且 header 被正确识别, 允许 Cross-Origin 调用。但这几乎只是我的 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 管理控制台中对此进行测试时,我的代码有效,并且我在 body 中得到了预期的响应。

但是当我尝试从我的 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" <- 这样的引号中的简单字符串时,它会失败。我相信这与请求中的 Content-Type 有关 application/json;charset=UTF-8 而我的请求只接受(正如它所说在 dev-tools) application/json 但是即使尝试添加 headers 以接受 content-type 的这种格式,我仍然得到同样的问题。

我不完全确定为什么 header 在 GET 请求上工​​作,而不是 POST 求教,有大佬能指教一下,谢谢!

编辑:我也尝试将 'Access-Control-Allow-Methods': "OPTIONS,GET,POST" 添加到 post 响应的 header 中,但这也没有用。

因此,在阅读了对我的问题的评论后,我决定值得一试,并仔细研究一下我在 AWS 上设置 API 网关和 Lambda 服务的方式。

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

我的 curl 请求面临的问题是我没有正确格式化 JSON 输入,但即使我是 Lambda 也在不正确地转换事件,没有产生字典,因为预期。

可以看到我使用的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" 值解码为我们存储为 body 的字典。然后要获取这两个属性的值,我们使用命令body.get("yourKey").

def yourPOST(event, context):

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

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