API Gateway CORS 问题,有效负载正确
Posted
技术标签:
【中文标题】API Gateway CORS 问题,有效负载正确【英文标题】:API Gateway CORS issue, with correct payload 【发布时间】:2017-08-16 17:12:24 【问题描述】:我整天都在努力解决这个问题。
当我向终端节点(使用 AWS API GATEWAY 配置)发出 POST 请求时,我尝试运行一个 Lambda 函数。
一切正常,我的选项获得了 200 分,我的帖子获得了 200 分,并返回了我想要的数据。
但是当我把它拿回来时,它“认为”它失败了。我在这个项目中使用了 JQuery,它以“失败”cb 的形式返回。
查看控制台日志问题很明显是以下错误:
XMLHttpRequest 无法加载 https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/prod/createCustomer。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:3000” 访问。
一个标准的 CORS 问题。但我所做的一切似乎都不起作用。我在 API 网关上启用了 CORS(在此之前 OPTIONS 会失败)。 'Access-Control-Allow-Origin':
设置为:'*'
应该允许从任何来源访问。我当然部署了新的 API。
我也尝试过不使用 CORS,而是启用 AWS 代理,并得到像 statusCode, headers, body
这样的回复,但这样做时我没有得到任何回复。
我完全不知道从哪里开始尝试解决这个问题。我什至尝试了一个肮脏的 jsonp 方法。但仍然是同样的问题。 :(
在我的请求中,我能找到的唯一一点看起来不太好的数据是:x-cache:Miss from cloudfront
这是来自 POST 请求的完整响应标头:
content-length:2312
content-type:application/json
date:Thu, 23 Mar 2017 22:15:08 GMT
status:200
via:1.1 95a477af435073615179b256d8101334.cloudfront.net (CloudFront)
x-amz-cf-id:Hc6POYFO0HKB1xriSg2iH7O1po7ah926a4dQkgfSNBUZ460RoHRNuw==
x-amzn-requestid:2b5ed745-1016-11e7-b497-cb0a77cd1479
x-amzn-trace-id:Root=1-58d448ea-56717776eaa3f5389083e9ca
x-cache:Miss from cloudfront
很遗憾,很明显,访问控制标头不存在...我认为这是我正在拼命尝试解决的问题。但我不知道为什么,因为我在此过程的 Enable CORS 步骤中将其设置为 ' * '。
通过手动创建 POST 方法(而不是“ANY”),然后再次启用 CORS,然后在集成响应上打开代理,并将我的响应设置为:@ 987654328@ 这将作为一个成功的事件返回,并在我的 ajax 调用中运行正确的回调函数。但是,使用这种方法,我没有从 Lambda 获得任何数据......尽管它在“body”中,但我收到的只是一个空对象。
我真的不喜欢使用 CORS 或手动添加标题,这很好,我不会更新这么多。我真的真的需要让它发挥作用:(任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我现在知道为什么了,但我能够让它工作。使用以下步骤:
-
启用 CORS,
部署 API,(可以跳过...)
手动添加POST方法,
在集成响应时启用代理,
再次部署 API
将回调响应更改为格式: statusCode: 200, headers: , body:
使用 JSON.parse() 解析您的负载。
这绝对不是一个完美的答案。出于某种原因,打开代理修改了我的 Lambda 函数接收数据的方式,所以我必须对其进行字符串化以不导致错误。我无法解释为什么会发生这种情况。
我使用的标题是:
"Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
"Access-Control-Allow-Origin": "*"
更好的解决方案也是仅使用 CORS 即可。因为您不必在所有回复中手动插入标题。但我无法让它工作。所以,如果有人知道这篇文章的更好解决方案,请!
【讨论】:
【参考方案2】:如果您从 API 获得 x-cache:Miss from cloudfront
,那很好,因为 API Gateway 不会在云端启用边缘缓存。如果您希望 CORS 与 Lambda 代理集成一起使用,您可以返回状态代码和标头,例如,
"statusCode": 200,
"headers": "Access-Control-Allow-Origin": "<domains you need>"
然后,它就像来自客户端的空响应。
【讨论】:
我已经尝试过上述代理方法,除了值是' * '
(通配符),我使用了body: data
,因为我确实需要返回响应数据。但即便如此,我仍然收到错误消息,并且没有返回任何有效负载。
你能分享你从 API Gateway 得到的错误吗?以上是关于API Gateway CORS 问题,有效负载正确的主要内容,如果未能解决你的问题,请参考以下文章
CloudFormation API Gateway CORS 问题访问 XMLHttpRequest 被阻止
使用 BOTO3 为 AWS Api Gateway 自动化 CORS