【发布时间】:2021-12-01 01:30:43
【问题描述】:
我们已经使用 Spring Cloud 函数创建了 AWS Lambda 函数。此函数返回 APIGatewayProxyResponseEvent 响应。下面的示例
{
"statusCode": 200,
"headers": {
"Access-Control-Expose-Headers": "Access-Control-Allow-Methods,Access-Control-Allow-Origin",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET",
"Access-Control-Max-Age": "200",
"Access-Control-Allow-Headers": "Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers",
"Content-Type": "application/json"
},
"multiValueHeaders": null,
"body": "response Data json Body",
"isBase64Encoded": false
}
APIGW 使用 Lambda 代理集成,因此没有响应映射选项。 我们已通过使用控制台上的操作启用了 CORS。这会自动添加 OPTIONS 方法,我们已经配置了带有以下标头的 200 响应
Access-Control-Max-Age : '200'
Access-Control-Allow-Headers : 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
Access-Control-Expose-Headers : 'Access-Control-Allow-Methods,Access-Control-Allow-Origin'
Access-Control-Allow-Origin : '*'
Access-Control-Allow-Methods : 'GET,OPTIONS'
以上步骤与AWS文档AWS - How to CORS Lambda proxy同步
我们在一个阶段部署了 API,并且能够通过 Postman 访问它。从当前位于本地主机上的 Web 应用程序访问时,我们会收到 CORS 错误。
在“网络”选项卡中,可以看到预检请求 (OPTIONS) 返回 200 OK 和所需的 CORS 标头。但是实际的 GET 调用仍然失败,说“CORS 错误”。
问题在于 APIGW 没有将 APIGatewayProxyResponseEvent 对象中返回的标头复制到最终的 APIGW 响应标头
这是一个已知问题还是我遗漏了什么
编辑
APIGW lambda 代理的屏幕截图
APIGW 响应的屏幕截图(从控制台测试)
浏览器开发者选项中的网络标签显示预检请求成功
编辑2
【问题讨论】:
-
你能分享一下请求和响应的截图吗?你说它返回标题然后说
APIGW is not copying the headers -
在这里参考我的回答 - stackoverflow.com/a/69499631/4800344
-
如果这是代理集成,您必须在代码中指定标头
-
控制台中的内容是什么? @MayankMadhav
-
@ErmiyaEskandary 说了什么。查看浏览器中的“控制台”选项卡。
标签: amazon-web-services aws-lambda cors aws-api-gateway spring-cloud-function