【发布时间】: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