8

有没有人让 AWS API Gateway 与 Angular.js 前端一起工作?我有一个通过 API Gateway 中的 POST 方法公开的 lambda 函数。我按照此文档的指示设置了标题:http: //docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

我在 Postman 中对其进行了测试,效果很好。我不需要做任何特别的事情,但是当我$http.post()打电话时,我只得到No 'Access-Control-Allow-Origin'请求的资源上存在标头。http://localhost:9000因此不允许Origin访问。响应HTTP status code 500.作为响应。

4

5 回答 5

8

Api Gateway 团队在这里。

希望现在您已经在控制台中检查了新的“启用 CORS”功能。即使您的开发工作流程在控制台之外,您也可以快速设置一个测试 API 并查看控制台为您设置的标头配置,然后将它们复制到您的 Swagger def 或您想出的任何解决方案中。

文档指南仍应适用于任何一种情况。您将需要 3 个标头:Access-Control-Allow-Methods、Access-Control-Allow-Origin 和 Access-Control-Allow-Headers。这些值将取决于您的 API。

如果您想将您尝试调用的 API 资源发送给我,我可以从我们这边看一下。

于 2015-12-18T19:42:34.080 回答
7

我目前有一个通过 API Gateway 和 Lambda 工作的 POST 函数,该函数可以从带有 CORS 的 Angular 客户端访问。虽然我不知道你的配置是什么,但我可以分享我所有的相关设置,希望你能找到你错过的东西。目前启用 CORS 是一件很痛苦的事情(希望亚马逊正在努力修复),需要在很多文档相当差的领域中执行很多小步骤。

我的资源有 2 种方法(OPTIONS 和 POST),我将分享每种方法的相关设置:

POST:
方法请求:没什么特别的。对于我的端点,我在请求路径下有一个用于我的路由参数之一的选项。我没有使用查询字符串,因此 URL 查询字符串为空。HTTP 请求标头也是空的。

集成请求:
集成类型:Lambda 映射模板:我有一个(应用程序/json)带有一个模板,用于将适当的值从请求正文和路由参数传递到我的 lambda 函数。

方法响应:
展开 200 状态代码字段。为“Access-Control-Allow-Origin”添加一个标题,然后单击复选标记按钮以保存它。您可能必须为您可能拥有的任何其他状态代码执行此操作。

集成响应:
展开 200 响应状态字段。在 Header Mappings 下,修改映射值以包含“*”。单引号是必需的。您可能必须为您可能拥有的任何其他集成响应执行此操作。

选项:
方法请求:
没什么特别的,就像 POST 方法一样。

集成请求:
我将其设置为模拟集成。根据亚马逊的说法,这没关系,所以我只是将它设置为模拟,因为我们真正需要做的就是使用适当的标头响应 200。没有映射模板。

方法响应:
展开 200 状态代码字段。添加以下 3 个响应标头并使用复选框保存它们:Access-Control-Allow-HeadersAccess-Control-Allow-MethodsAccess-Control-Allow-Origin。不存在其他状态代码。

集成响应:
展开 200 响应状态字段。正则表达式为空(设置为默认值),此方法只有 200 响应。展开标头映射并将标头设置为以下映射值:

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 值。

于 2015-11-03T03:01:37.457 回答
2

TLDR;这不是 CORS 问题,问题来自 API Gateway,请检查 API Gateway 上的 API 处理程序的问题。在您的 UI 项目中使用它之前,请确保您的 API 可以与 Postman 一起使用。

您可以按照本指南如何使用 CORS。但看起来你已经做了这个动作。

让我们先谈谈 CORS:这是一种机制,可以帮助您在客户使用您的 Web 应用程序时保护他们,允许您配置响应标头,以便:

  • 其他主机可以访问您的 Web 应用程序的资源。例如:Access-Control-Allow-Origin: abc.com,当您返回带有此标头的响应时。这将允许来自 host 的请求abc.com
  • 限制对特定 HTTP 方法的访问。例如:Access-Control-Allow-Methods: GET, PUT,只允许origin用方法GET或访问资源PUT,不允许POST, DELETE或其他任何方法。
  • 仅允许请求具有与您定义的列表匹配的标头。Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,其中一些标头是由亚马逊定义的,您实际上可以指定自己的标头。

您应该考虑为这些属性设置值。我的意见是在开发时使用 * ( ),并在发布 API 时Access-Control-Allow-Origin: *将值更改为特定域或通配符 ( )。Access-Control-Allow-Origin: *.abc.com

以下是 CORS 的工作原理:

在此处输入图像描述

正如您在此处看到的,在您将实际请求发送到 API Gateway 之前,您的浏览器向 API Gateway 发送了一个 OPTIONS 请求,以确保您的请求被允许发送到 API Gateway。如果 OPTIONS 请求返回 200,那么您的实际请求将被发送到 API Gateway。

  1. 如果您的 OPTIONS 请求失败。那么您的请求将无法发送到 API Gateway。在开发人员工具中,您会看到类似No 'Access-Control-Allow-Origin' is present on the requested resource...但没有更多错误消息的内容。请求将返回状态为0-> 您必须配置 CORS。

  2. 另一种情况与您对问题的解释相同。得到HTTP Status Code 500了,还有一些关于 CORS 的东西。这不是 CORS 问题,我认为是浏览器问题。在这种情况下,OPTIONS请求返回状态码 200。您的实际请求返回状态码 500,这意味着您的 API 已经损坏。浏览器仍然发送No 'Access-Control-Allow-Origin' is present on the requested resource...错误。在这种情况下,您必须调试 API 才能看到问题。

希望有帮助!

于 2019-02-02T15:01:10.160 回答
1

您可以从 AWS API Gateway 中“启用 CORS”功能。登录到您的 AWS 账户并导航到 API Gateway。在资源下选择一个资源,然后从操作下拉菜单中选择启用 CORS。这将为资源上的所有方法启用 CORS。详情请查看以下链接

https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

于 2018-04-19T07:04:11.370 回答
0

由于您的错误显示“请求的资源上不存在'Access-Control-Allow-Origin'标头”。听起来当您尝试从 Angular 调用 API 时,它没有获得在您遵循 Amazon 文档时设置的 Access-Control-Allow-Origin 标头。

首先,我会仔细检查您是否为 API 调用了正确的 URL。亚马逊在阶段屏幕中显示此内容,但您必须将阶段名称附加到他们显示给您的 URL。因此,如果您部署到“产品”阶段并且它们显示

https://xyz.execute-api.us-west-2.amazonaws.com/my-api

你需要打电话

https://xyz.execute-api.us-west-2.amazonaws.com/my-api/prod

接下来,我会尝试从邮递员调用 API 上的 OPTIONS 方法。将 POST 方法更改为 OPTIONS 并调用 API 后,检查 Postman 的结果部分中的标头。你想在那里看到以下内容:

Access-Control-Allow-Methods → POST,OPTIONS
Access-Control-Allow-Origin → *

如果您无法在响应中看到这些内容,请仔细检查 API 中 OPTIONS 方法下的方法响应。确保为 200 响应添加了这些标头。

最后,您可以尝试使用亚马逊最近添加的“启用 CORS”按钮。在左侧树视图中选择您的资源,然后在右上角查找“启用 CORS”按钮。单击该按钮,AWS 将重新创建所有与 CORS 相关的方法。

我希望其中一些步骤有所帮助!

于 2015-11-21T16:14:28.757 回答