AWS API Gateway Serverless验证请求正文并在响应中返回错误消息

时间:2019-04-22 18:23:22

标签: aws-lambda aws-api-gateway aws-serverless

我正在使用Serverless设置AWS API Gateway。理想情况下,不应使用AWS控制台配置任何内容,而仅使用Serverless进行部署。

我想让它验证在此项目中也已设置的各种Lambda函数的请求主体。应该通过将接收到的主体与关联的JSON模式文件进行比较来完成此验证。对于格式错误的请求,我希望响应指示哪些属性丢失或类型错误。

我找到了serverless-reqvalidator-plugin来解决根据模式进行验证的问题。验证项目在资源中进行了描述,该模式使用serverless-aws-documentation plugin与定制部分中的验证项目相关联,然后使用http中的reqValidatorName属性将该函数与功能部分中的验证对象相关联。事件。理想情况下,在这里的某个地方,我想设置在发生错误时响应中应返回什么消息。

// serverless.yml

resources:
   Resources:
      BodyValidation:  
         Type: "AWS::ApiGateway::RequestValidator"
         Properties:
           Name: 'BodyValidation'
           RestApiId: 
             Ref: ApiGatewayRestApi
           ValidateRequestBody: true
           ValidateRequestParameters: false
           /// Ideally, some property about how to dynamically return an error message for invalid requests would be here, or bellow

custom:
  documentation:
// --- cut out api info
    models:
      - name: BodyValidationRequest
        contentType: "application/json"
        schema: ${file(./SampleValidationRequest.json)}

functions:
   SampleValidationFunction:
      //--- cut handler info
       events: 
         - http: 
              //--- cut path and method info
              reqValidatorName: BodyValidation
              documentation: // --- cut documentation info


我按照this answer的指示以同样的方式进行了处理。我会对不依赖reqvalidator插件的操作感兴趣,但是在AWS API Gateway文档中的this example中,它没有显示如何使用Serverless来实现。

看起来像wasn't possible in the past,但似乎be possible now。我严格使用serverless.yml找不到任何示例。

我正在AWS控制台和Postman中测试请求。例如,这是我要测试的架构:

// SampleValidationRequest.json

{
  "type": "object",
  "properties" :{
    "name": {
      "type": "string"
    },
    "id": {
      "type": "number"
    }
  },
  "required": ["name", "id"]
}

当发送的正文缺少参数时,例如id带有:

{
    "name": "test"
}

我收到了回复正文

{
  "message": "Invalid request body"
}

我想说的话类似于我在AWS中查看日志时看到的内容

{
  "message": "Request body does not match model schema for content type application/json: [object has missing required properties (["id"])]
}

所以,总结一下:

1。是否可以添加一些属性来动态解释响应消息中的请求正文有什么问题?

2。是否可以仅使用Serverless的AWS API设置而不是reqvalidator针对架构验证请求正文?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 是否可以添加一些属性来动态解释响应消息中的请求正文有什么问题?
  2.   

在一定程度上。查看此线程:https://github.com/serverless/serverless/issues/3896

您将需要向resource添加serverless.yml属性,如下所示:

resources:
  Resources:
    ApiGatewayRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Name: ${self:provider.stage}-${self:service}
    GatewayResponseResourceNotFound:
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        RestApiId:
          Ref: 'ApiGatewayRestApi'
        ResponseType: BAD_REQUEST_BODY
        "StatusCode" : "422"
        ResponseTemplates:
          application/json: "{\"message\": \"$context.error.message\", \"error\": \"$context.error.validationErrorString\"}"
  
      
  1. 是否可以仅使用Serverless中针对AWS API的设置而不是reqvalidator来针对架构验证请求正文?
  2.   

是的,有可能。确保更新到Serverless的最新版本,否则它将无提示地生成API网关模型。

以下是适用于我的设置:

    events:
      - http:
          path: my_method/
          method: post
          request:
            schema:
              application/json: ${file(validate_my_method.json)}