POST请求无法识别标题

时间:2019-08-11 22:39:17

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

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

我已经听说过通过将标头添加到AWS lambda的响应中来解决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中,我看到我们传递了一个发布请求,没有问题,并且可以正确识别标头,从而允许跨域调用。但这几乎只是我已经设置并可以正常运行的 GET 请求。因此,当我更新它使其更类似于 POST方法并执行我希望问题开始的工作时。

因此,我想在 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 Management控制台中对此进行测试时,我的代码可以正常工作,并且可以在体内获得预期的响应。

但是当我尝试从我的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 有关,而我的请求仅接受(如在开发工具中所说) application / json 但是,即使尝试添加标题以接受这种内容类型的格式,我仍然遇到相同的问题。

我不太确定为什么标头可用于 GET 请求,而不适用于 POST 请求,并且希望有人能帮助教我,谢谢!

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

1 个答案:

答案 0 :(得分:0)

因此,在阅读完有关我的问题的评论后,我认为值得一试,并仔细研究一下我在API上设置API网关和在AWS上设置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”值解码为字典我们以body的形式存储。然后,要获取两个属性的值,请使用命令body.get("yourKey")

def yourPOST(event, context):

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

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