【问题标题】:"Enable CORS" in AWS API Gateway resource?AWS API Gateway 资源中的“启用 CORS”?
【发布时间】:2018-02-21 01:24:22
【问题描述】:

我在使用 AWS API Gateway 时遇到问题。 我正在使用 Angular 4(使用 TypeScript 语言)开发一个 Web 应用程序,但是如果我从前端调用 PUT 方法, 出现以下错误信息:

Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

这很奇怪,因为在 AWS 控制台中,PUT 方法运行良好(我直接从 API Gateway 控制台进行了许多测试,并在部署后使用了一个阶段,一切正常)。如果我转到“Actions/Enable CORS”,所有方法都有检查,包括 PUT 方法,我没有准确解释 API 网关的问题。

如果在 API 网关中一切正常,为什么会出现此错误?有没有办法改变这些 CORS?

【问题讨论】:

  • 能否请您提供请求 url、OPTIONS 的响应标头和 PUT 响应 url 到工单?如果无法从浏览器获取,可以使用 Postman 或 CURL。
  • 这不是 API Gateway 的错误,看起来您使用的任何浏览器/客户端都不允许 PUT

标签: angular amazon-web-services typescript aws-api-gateway put


【解决方案1】:

当我不久前被同样的问题击中时,我想起了什么......

使用 Lambda 或 HTTP 代理集成时,您需要在 lambda 的响应中至少指定 Access-Control-Allow-Origin 标头。您可能已经指定了其他内容(目前手头没有任何代码)。我确实记得这条消息有点误导,并且从管理控制台进行测试是有效的,因为它并没有真正使用 CORS,因为控制台执行测试的方式。

看看最后一节:Enabling CORS for a REST API resource

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "https://www.example.com",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
        },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

您需要将Access-Control-Allow-Origin 替换为您的客户端应用程序使用的主机名。作为快速测试使用 *,但不要投入生产,因为这违背了 CORS 的目的。

【讨论】:

    【解决方案2】:

    请按照以下步骤,

    1. 在 /services 资源下创建一个新的 OPTIONS 方法
    2. 在 OPTIONS 方法中创建并填充 Access-Control-Allow-Origin/Method/Headers。

    在创建 OPTIONS 后启用如下所示的 CORS

    来源:-https://forums.aws.amazon.com/thread.jspa?messageID=644489

    【讨论】:

    • 启用 CORS 始终从根目录打开,不能与其中一种方法一起使用!
    • 我已经编辑了一些答案。如果您没有选项,请添加它。请查看更新后的答案。
    • 我的 OPTION 方法存在并且已经有 Access-Control-Allow-Origin / Method / Headers。应用程序给出了同样的错误...
    • 解决了吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2020-02-20
    • 2019-03-08
    • 2020-08-17
    • 2021-03-08
    • 2020-08-21
    • 2017-09-19
    • 2021-05-29
    相关资源
    最近更新 更多