如何让API网关返回405响应

问题描述 投票:0回答:3

您好,AWS 云专家,

当在任何资源上使用不受支持的 HTTP 动词时,我试图允许我的 REST API 返回 405。

我看到有一些方法可以定义GatewayResponses

但是,我没有看到任何明显的方法来返回 405(除了将其定义为

DEFAULT_4XX
,这似乎不正确)

  ExampleApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      OpenApiVersion: '3.0.1'
      GatewayResponses:
        DEFAULT_4XX:
          StatusCode: 405
          ResponseTemplates:
            "application/*": '{ "message": "Method Not Allowed" }'

有人知道该怎么做吗?

amazon-web-services aws-api-gateway aws-sam
3个回答
1
投票

一种解决方案是创建一个附加到 API 的 lambda 函数,以处理需要指示 405 的特定端点

  ExampleApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      OpenApiVersion: '3.0.1'

  MethodNotAllowedResponse:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: nodejs14.x
      Handler: index.handler
      InlineCode: |
        let response;
        exports.handler = (event, context, callback) => {
          response = {
            "statusCode": 405,
            "headers": {
              "Content-Type": "application/problem+json"
            },
            "body": JSON.stringify({
              "type": "https://tools.ietf.org/html/rfc7231#section-6",
              "status": 405,
              "title": "Method Not Allowed",
              "detail": `Method ${event.httpMethod} is not allowed on ${event.path}`
            })
            }
          callback(null, response);
        }
      Events:
        Televisions:
          Type: Api
          Properties:
            Auth:
              Authorizer: NONE
            RestApiId: !Ref ExampleApi
            Path: '/not/allowed/path'
            Method: patch

0
投票

这可以作为模拟集成来实现,然后您可以将其用于任何未实现/支持的方法。

集成请求映射

{
  "statusCode": 405,
  "message": "The invoked method is not supported on the API resource."
}

0
投票

我也有类似的需求:

  • GET 方法的返回响应
  • 对于任何其他 HTTP 方法返回 405。

我已经通过以下方式解决了这个问题:

#1 在 API Gateway 方法 ANY 中添加到我的资源(除了已经存在的 GET 方法)

  • 然后对于ANY方法
    Integration Response -> Mapping Templates -> New template application/json
  • 在模板中添加了以下代码:
    #set($context.responseOverride.status = 405)

© www.soinside.com 2019 - 2024. All rights reserved.