API-шлюз проверяет заголовок типа контента - PullRequest
0 голосов
/ 20 сентября 2018

ЕСЛИ тип содержимого не является шлюзом 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 голосов
/ 05 августа 2019

Поскольку я сам также искал ответ на этот вопрос после столь длительного времени, единственное решение, которое я нашел, которое включало файл спецификации 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

К сожалению, это очень громоздко для меня, и я просто решил использовать стандартную интеграцию прокси сдля проверки запроса установлено все:

x-amazon-apigateway-request-validators: {
  all: {
    validateRequestBody: true,
    validateRequestParameters: true
  }
}
x-amazon-apigateway-request-validator: all
0 голосов
/ 05 января 2019

Перейдите на вкладку Integration Request вашей конечной точки, нажмите Mapping Templates, установите Request body passthrough на never, добавьте шаблон сопоставления для application/javascript и нажмите Method Request Passthrough в раскрывающемся списке рядом с Generate template.

Вот фрагмент кода: requestTemplates: application/json: | ## See http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html ## This template will pass through all parameters including path, querystring, header, stage variables, and context through to the integration endpoint via the body/payload #set($allParams = $input.params()) { "body-json" : $input.json('$'), "params" : { #foreach($type in $allParams.keySet()) #set($params = $allParams.get($type)) "$type" : { #foreach($paramName in $params.keySet()) "$paramName" : "$util.escapeJavaScript($params.get($paramName))" #if($foreach.hasNext),#end #end } #if($foreach.hasNext),#end #end }, "stage-variables" : { #foreach($key in $stageVariables.keySet()) "$key" : "$util.escapeJavaScript($stageVariables.get($key))" #if($foreach.hasNext),#end #end }, "context" : { "account-id" : "$context.identity.accountId", "api-id" : "$context.apiId", "api-key" : "$context.identity.apiKey", "authorizer-principal-id" : "$context.authorizer.principalId", "caller" : "$context.identity.caller", "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider", "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType", "cognito-identity-id" : "$context.identity.cognitoIdentityId", "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId", "http-method" : "$context.httpMethod", "stage" : "$context.stage", "source-ip" : "$context.identity.sourceIp", "user" : "$context.identity.user", "user-agent" : "$context.identity.userAgent", "user-arn" : "$context.identity.userArn", "request-id" : "$context.requestId", "resource-id" : "$context.resourceId", "resource-path" : "$context.resourcePath" } } passthroughBehavior: "never" httpMethod: "POST" type: "aws"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...