API网关验证内容类型标头

时间:2018-09-20 15:23:45

标签: amazon-web-services aws-lambda aws-api-gateway

如果内容类型不是json api网关,则不进行验证,仅通过验证。我正在使用代理集成,因此没有映射模板,只能使用“ when_no_match”。我正在使用内联招摇。

我可以检查标题是否存在,但不能检查值-我该怎么做?

/myMethod:
    post:
        x-amazon-apigateway-request-validator : "myvalidator"
        parameters:
        # How do I also validate Content-Type value is "application/json"
        - name: Content-Type
          in: header
          required: true

我希望API网关对此进行验证,因此我不必在代码中对其进行检查

2 个答案:

答案 0 :(得分:0)

转到端点的Integration Request选项卡,单击Mapping Templates,将Request body passthrough设置为never,为application/javascript添加映射模板,然后单击{ {1}旁边的下拉菜单中的{1}}。

这是招摇的摘要: Method Request Passthrough

答案 1 :(得分:0)

由于我自己也在很长一段时间后也在寻找答案,因此我发现涉及swagger / openapi规范文件的唯一解决方案是使用此映射模板(这是我能想到的最短的模板):

#set($allParams = $input.params())
    {
        "body" : $input.json('$'),
        #set($pathParams = $allParams.get('path'))
        "pathParameters" : {
            #foreach($paramName in $pathParams.keySet())
                "$paramName" : "$util.escapeJavaScript($pathParams.get($paramName))"
                #if($foreach.hasNext),#end
            #end
        },
        #set($queryParams = $allParams.get('querystring'))
        "queryString" : {
            #foreach($paramName in $queryParams.keySet())
                "$paramName" : "$util.escapeJavaScript($queryParams.get($paramName))"
                #if($foreach.hasNext),#end
            #end
        }
    }

在我们要应用于的规范路径中:

  paths:
    /your-path:
      x-amazon-apigateway-integration:
        credentials: "arn:aws:iam::xxx:role/yyy"
        uri: "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:zzz:function:qqq/invocations"
        responses:
          default:
            statusCode: 200
        passthroughBehavior: never
        httpMethod: POST
        requestTemplates:
          application/json: "#set($allParams = $input.params())\n        {\n     \
        \       \"body\" : $input.json('$'),\n            #set($pathParams = $allParams.get('path'))\n\
        \            \"pathParameters\" : {\n                #foreach($paramName\
        \ in $pathParams.keySet())\n                    \"$paramName\" : \"$util.escapeJavaScript($pathParams.get($paramName))\"\
        \n                    #if($foreach.hasNext),#end\n                #end\n\
        \            },\n            #set($queryParams = $allParams.get('querystring'))\n\
        \            \"queryString\" : {\n                #foreach($paramName\
        \ in $queryParams.keySet())\n                    \"$paramName\" : \"$util.escapeJavaScript($queryParams.get($paramName))\"\
        \n                    #if($foreach.hasNext),#end\n                #end\n\
        \            }\n        }"
        type: aws

不幸的是,这对我来说太笨拙了,我决定使用标准的Proxy Integration,并将请求验证设置为所有人:

x-amazon-apigateway-request-validators: {
  all: {
    validateRequestBody: true,
    validateRequestParameters: true
  }
}
x-amazon-apigateway-request-validator: all