首页 > 解决方案 > 通过 SAM 创建 API 时,Access-Control-Allow-Headers 在预检响应中不允许请求标头字段内容类型

问题描述

我正在使用 SAM 模板创建 Rest API。

我正在通过 Postman 测试这些 API,一切都按预期工作,但是一旦我将这些 API 集成到我的应用程序中,我就会收到此错误:

from origin 'http://localhost:3033' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

这只发生在 PUT、POST 和 PATCH 方法中。GET 方法工作正常。

我在代码返回部分添加了以下内容:

return {
    "statusCode": 200,
    "headers": {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "*"},
    "body": json.dumps(item)
}

但是,错误仍然出现。

我创建了一个 API 和 lambda 来为控制台提供相同的功能,并且它在应用程序中运行良好。

这是我用于创建 API 的 SAM 代码:

ApiGatewaySignUpFlowUserApi:
  Type: AWS::Serverless::Api
  Properties:
    Name: loadeo_signup
    StageName: Stage
    Cors: "'*'"

CreateUserSignup:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: loadeo_create_user_signup
    CodeUri: createUserSignup/
    Handler: create_user_signup.lambda_handler
    Timeout: 5
    Runtime: python3.8
    Role: arn:aws:iam::272075499248:role/loadeo_lambda_execution
    MemorySize: 128
    Events:
      GetAllUser:
        Type: Api
        Properties:
          Path: /create-user
          Method: post
          RestApiId:
            Ref: ApiGatewaySignUpFlowUserApi

我真的不明白这里可能出了什么问题。谁能帮我解决这个问题?

标签: amazon-web-servicesaws-lambdaaws-api-gatewayaws-sam

解决方案


将 API 定义更改为以下有助于我解决问题:

ApiGatewaySignUpFlowUserApi:
  Type: AWS::Serverless::Api
  Properties:
    Name: loadeo_signup
    StageName: Stage
    Cors: 
      AllowMethods: "'*'"
      AllowHeaders: "'*'"
      AllowOrigin: "'*'"  

明确指定 CORS 规则有帮助。


推荐阅读