这里是Api Gateway团队。
希望你已经在控制台中查看了新的“启用CORS”功能。即使您的开发工作流程不在控制台中,您也可以快速设置一个测试API,并查看控制台为您设置的标头配置,然后将它们复制到Swagger def或您想出的任何解决方案中。
文档指南仍然适用于任一情况。您将需要3个标头:Access-Control-Allow-Methods、Access-Control-Allow-Origin和Access-Control-Allow-Headers。这些的值将取决于您的API。
如果您想向我发送您正在尝试调用的API资源,我可以从我们这边查看。
Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Requested-With'
Access-Control-Allow-Methods: 'GET,POST,OPTIONS'
Access-Control-Allow-Origin: '*'
没有映射模板。
然后部署您的API。希望现在可以允许CORS请求。我遇到了与您相同的问题,我相当确定问题是缺少Access-Control-Allow-Headers中的X-Requested-With值。
Access-Control-Allow-Origin: abc.com
,当您返回带有此标头的响应时。这将允许来自主机 abc.com
的请求。Access-Control-Allow-Methods: GET, PUT
,仅允许源访问具有方法 GET
或 PUT
的资源,不允许 POST、DELETE
或任何其他方法。Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
,Amazon 定义了其中一些标头,实际上您可以指定自己的标头。您应该考虑设置这些属性的值。在我看来,当您正在开发时只需使用 * (Access-Control-Allow-Origin: *
),并在发布 API 时将值更改为特定域或通配符 (Access-Control-Allow-Origin: *.abc.com
)。
以下是 CORS 的工作原理:
正如您在这里看到的,在您实际请求发送到API网关之前,您的浏览器向API网关发送了一个OPTIONS请求,以确保您的请求被允许发送到API网关。如果OPTIONS请求返回200,则您的实际请求将被发送到API网关。https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
由于您的错误显示“请求资源中缺少'Access-Control-Allow-Origin'标头。”,这表明当您尝试从Angular调用API时,它没有获取在遵循Amazon文档时设置的Access-Control-Allow-Origin标头。
首先,请确保您正在调用API的正确URL。 Amazon在阶段屏幕上显示此内容,但您必须将阶段名称附加到他们向您显示的URL上。因此,如果您部署到“prod”阶段并且他们显示
https://xyz.execute-api.us-west-2.amazonaws.com/my-api
。
https://xyz.execute-api.us-west-2.amazonaws.com/my-api/prod
Access-Control-Allow-Methods → POST,OPTIONS
Access-Control-Allow-Origin → *
如果您无法在响应中看到它们,请仔细检查 API 下 OPTIONS 方法下的方法响应。确保这些标头已添加到 200 响应中。
作为最后的结果,您可以尝试使用亚马逊最近添加的“启用 CORS”按钮。在左侧树形视图中选择您的资源,然后查找右上角的“启用 CORS”按钮。单击该按钮,AWS 将重新创建所有与 CORS 相关的方法。
希望这些步骤中的一些能够帮助您!