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 站点的调用可以正常运行!如果有人有任何问题,请随时发表评论,希望对您有所帮助!
我正在尝试向我设置的 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 站点的调用可以正常运行!如果有人有任何问题,请随时发表评论,希望对您有所帮助!