Configuración de la validación básica de solicitudes en API Gateway - Amazon API Gateway

Configuración de la validación básica de solicitudes en API Gateway

En esta sección se muestra cómo configurar la validación de solicitudes para API Gateway mediante la consola, la AWS CLI y una definición de OpenAPI.

Configuración de la validación de solicitudes mediante la consola de API Gateway

Para utilizar la consola de API Gateway para validar una solicitud, seleccione uno de los tres validadores para una solicitud de API:

  • Validar el cuerpo.

  • Validar los parámetros de la cadena de consulta y los encabezados.

  • Validar el cuerpo, los parámetros de la cadena de consulta y los encabezados.

Al aplicar uno de los validadores en un método de la API, la consola de API Gateway lo agrega al mapa RequestValidators de la API.

Para seguir este tutorial, utilizará una plantilla AWS CloudFormation para crear una API de API Gateway incompleta. Esta API incompleta tiene un recurso /validator con los métodos GET y POST. Ambos métodos están integrados con el punto de conexión HTTP http://petstore-demo-endpoint.execute-api.com/petstore/pets. Configurará dos tipos de validación de solicitudes:

  • En el método GET, configurará la validación de solicitudes para los parámetros de la cadena de consulta URL.

  • En el método POST, configurará la validación de solicitudes para el cuerpo de la solicitud.

Esto permitirá que solo ciertas llamadas a la API pasen a la API.

Descargue y descomprima la plantilla de creación de aplicaciones para AWS CloudFormation. Usará esta plantilla para crear una API incompleta. Finalizará el resto de los pasos en la consola de API Gateway.

Para crear una pila de AWS CloudFormation
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Seleccione Create stack (Crear pila) y, a continuación, seleccione With new resources (standard) (Con nuevos recursos [estándar]).

  3. En Specify template (Especificar plantilla), elija Upload a template file (Cargar un archivo de plantilla).

  4. Seleccione la plantilla que ha descargado.

  5. Elija Next (Siguiente).

  6. En Stack name (Nombre de pila), escriba request-validation-tutorial-console y, a continuación, elija Next (Siguiente).

  7. En Configure stack options (Configurar opciones de pila), elija Next (Siguiente).

  8. Para Capabilities (Capacidades), sepa que AWS CloudFormation puede crear recursos de IAM en su cuenta.

  9. Seleccione Submit (Enviar).

AWS CloudFormation aprovisiona los recursos especificados en la plantilla. Puede tardar varios minutos en finalizar el aprovisionamiento de los recursos. Cuando el estado de la pila de AWS CloudFormation sea CREATE_COMPLETE, estará listo para continuar con el paso siguiente.

Para seleccionar la API recién creada
  1. Seleccione la pila request-validation-tutorial-console recién creada.

  2. Seleccione Recursos.

  3. En ID físico, seleccione la API. Este enlace lo dirigirá a la consola de API Gateway.

Antes de modificar los métodos GET y POST, debe crear un modelo.

Para crear un modelo
  1. Se requiere un modelo para usar la validación de solicitudes en el cuerpo de una solicitud entrante. Para crear un modelo, en el panel de navegación principal, elija Modelos.

  2. Seleccione Crear modelo.

  3. En Nombre, escriba PetStoreModel.

  4. En Tipo de contenido, indique application/json. Si no se encuentra ningún tipo de contenido coincidente, no se realiza la validación de la solicitud. Para utilizar el mismo modelo independientemente del tipo de contenido, introduzca $default.

  5. En Descripción, indique My PetStore Model como descripción del modelo.

  6. En Esquema del modelo, pegue el siguiente modelo en el editor de código y seleccione Crear.

    { "type" : "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "type" : "number", "minimum" : 25.0, "maximum" : 500.0 } } }

Para obtener más información acerca del modelo, consulte Modelos de datos para las API de REST.

Para configurar la validación de solicitudes para un método GET
  1. En el panel de navegación principal, seleccione Recursos y, a continuación, seleccione el método GET.

  2. En la pestaña Solicitud de método, en Configuración de solicitud de método, elija Editar.

  3. En Validador de solicitud, seleccione Validar parámetros de cadena de consulta y encabezados.

  4. En Parámetros de cadenas de consulta de URL, haga lo siguiente:

    1. Elija Add query string (Añadir cadena de consulta).

    2. En Nombre, escriba petType.

    3. Active la opción Obligatorio.

    4. Mantenga Almacenamiento en caché desactivado.

  5. Seleccione Guardar.

  6. En la pestaña Solicitud de integración, en Configuración de la solicitud de integración, seleccione Editar.

  7. En Parámetros de cadenas de consulta de URL, haga lo siguiente:

    1. Elija Add query string (Añadir cadena de consulta).

    2. En Nombre, escriba petType.

    3. En Mapeado de, introduzca method.request.querystring.petType. Esto mapea el petType con el tipo de mascota.

      Para obtener más información sobre el mapeo de datos, consulte el tutorial de mapeo de datos.

    4. Mantenga Almacenamiento en caché desactivado.

  8. Seleccione Guardar.

Para probar la validación de solicitudes para el método GET
  1. Elija la pestaña Prueba. Puede que tenga que elegir el botón de flecha hacia la derecha para mostrar la pestaña.

  2. En Cadenas de consulta, introduzca petType=dog y seleccione Prueba.

  3. La prueba del método dará como resultado 200 OK y mostrará una lista de perros.

    Para obtener información sobre cómo transformar estos datos de salida, consulte el tutorial de mapeo de datos.

  4. Elimine petType=dog y seleccione Pruebas.

  5. La prueba del método devolverá un error 400 con el siguiente mensaje de error:

    { "message": "Missing required request parameters: [petType]" }
Para configurar la validación de solicitudes para el método POST
  1. En el panel de navegación principal, seleccione Recursos y, a continuación, seleccione el método POST.

  2. En la pestaña Solicitud de método, en Configuración de solicitud de método, elija Editar.

  3. En Validador de solicitudes, seleccione Validar cuerpo.

  4. En Cuerpo de la solicitud, seleccione Agregar modelo.

  5. En Tipo de contenido, introduzca application/json y, a continuación, en Modelo, seleccione PetStoreModel.

  6. Seleccione Guardar.

Para probar la validación de solicitudes para un método POST
  1. Elija la pestaña Prueba. Puede que tenga que elegir el botón de flecha hacia la derecha para mostrar la pestaña.

  2. En Cuerpo de la solicitud, pegue lo siguiente en el editor de código:

    { "id": 2, "name": "Bella", "type": "dog", "price": 400 }

    Seleccione Probar.

  3. La prueba del método devolverá 200 OK y un mensaje de éxito.

  4. En Cuerpo de la solicitud, pegue lo siguiente en el editor de código:

    { "id": 2, "name": "Bella", "type": "dog", "price": 4000 }

    Seleccione Probar.

  5. La prueba del método devolverá un error 400 con el siguiente mensaje de error:

    { "message": "Invalid request body" }

    En la parte inferior de los registros de pruebas, se mostrará el motivo por el que el cuerpo de la solicitud no es válido. En este caso, el precio de la mascota estaba fuera del máximo especificado en el modelo.

Para eliminar una pila de AWS CloudFormation
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Seleccione su pila de AWS CloudFormation.

  3. Elija Delete (Eliminar) y, a continuación, confirme su elección.

Siguientes pasos

Configuración de la validación básica de solicitudes mediante la AWS CLI

Puede crear un validador para configurar la validación de solicitudes mediante la AWS CLI Para seguir este tutorial, utilizará una plantilla AWS CloudFormation para crear una API de API Gateway incompleta.

nota

Esta no es la misma plantilla de AWS CloudFormation que la del tutorial de la consola.

Con un recurso /validator preexpuesto, creará los métodos GET y POST. Ambos métodos están integrados con el punto de conexión HTTP http://petstore-demo-endpoint.execute-api.com/petstore/pets. Configurará las dos validaciones de solicitudes siguientes:

  • En el método GET, creará un validador params-only para validar los parámetros de la cadena de consulta de URL.

  • En el método POST, creará un validador body-only para validar el cuerpo de la solicitud.

Esto permitirá que solo ciertas llamadas a la API pasen a la API.

Para crear una pila de AWS CloudFormation

Descargue y descomprima la plantilla de creación de aplicaciones para AWS CloudFormation.

Para completar el siguiente tutorial, necesita la versión 2 de la AWS Command Line Interface (AWS CLI).

Para comandos largos, se utiliza un carácter de escape (\) para dividir un comando en varias líneas.

nota

En Windows, algunos comandos de la CLI de Bash que utiliza habitualmente (por ejemplo, zip) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, instale el subsistema de Windows para Linux. Los comandos de la CLI de ejemplo de esta guía utilizan el formato Linux. Los comandos que incluyen documentos JSON en línea deben reformatearse si utiliza la CLI de Windows.

  1. Utilice el siguiente comando para crear la pila AWS CloudFormation.

    aws cloudformation create-stack --stack-name request-validation-tutorial-cli --template-body file://request-validation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM
  2. AWS CloudFormation aprovisiona los recursos especificados en la plantilla. Puede tardar varios minutos en finalizar el aprovisionamiento de los recursos. Use el siguiente comando para ver el estado de su pila AWS CloudFormation.

    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli
  3. Cuando el estado de su pila AWS CloudFormation sea StackStatus: "CREATE_COMPLETE", utilice el siguiente comando para recuperar los valores de salida relevantes para los pasos futuros.

    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"

    A continuación se muestran los valores de salida:

    • ApiID, que es el identificador de la API. Para este tutorial, el ID de la API es abc123.

    • ResourceId, que es el identificador del recurso del validador donde están expuestos los métodos GET y POST. Para este tutorial, el ID del recurso es efg456.

Para crear los validadores de solicitudes e importar un modelo
  1. Se requiere un validador para utilizar la validación de solicitudes con la AWS CLI. Utilice el siguiente comando para crear un validador que valide únicamente los parámetros de la solicitud.

    aws apigateway create-request-validator --rest-api-id abc123 \ --no-validate-request-body \ --validate-request-parameters \ --name params-only

    Anote el ID del validador params-only.

  2. Utilice el siguiente comando para crear un validador que valide únicamente el cuerpo de la solicitud.

    aws apigateway create-request-validator --rest-api-id abc123 \ --validate-request-body \ --no-validate-request-parameters \ --name body-only

    Anote el ID del validador body-only.

  3. Se requiere un modelo para usar la validación de solicitudes en el cuerpo de una solicitud entrante. Utilice el siguiente comando para importar un modelo.

    aws apigateway create-model --rest-api-id abc123 --name PetStoreModel --description 'My PetStore Model' --content-type 'application/json' --schema '{"type": "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : {"type" : "integer"},"type" : {"type" : "string", "enum" : [ "dog", "cat", "fish" ]},"name" : { "type" : "string"},"price" : {"type" : "number","minimum" : 25.0, "maximum" : 500.0}}}}'

    Si no se encuentra ningún tipo de contenido coincidente, no se realiza la validación de la solicitud. Para utilizar el mismo modelo independientemente del tipo de contenido, especifique $default como la clave.

Para crear los métodos GET y POST
  1. Use el siguiente comando para añadir el método HTTP GET en el recurso /validate. Este comando crea el método GET, agrega el validador params-only y establece la cadena de consulta petType según sea necesario.

    aws apigateway put-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --authorization-type "NONE" \ --request-validator-id aaa111 \ --request-parameters "method.request.querystring.petType=true"

    Use el siguiente comando para añadir el método HTTP POST en el recurso /validate. Este comando crea el método POST, agrega el validador body-only y adjunta el modelo al validador exclusivo para el cuerpo.

    aws apigateway put-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --authorization-type "NONE" \ --request-validator-id bbb222 \ --request-models 'application/json'=PetStoreModel
  2. Use el siguiente comando para configurar la respuesta 200 OK del método GET /validate.

    aws apigateway put-method-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --status-code 200

    Use el siguiente comando para configurar la respuesta 200 OK del método POST /validate.

    aws apigateway put-method-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --status-code 200
  3. Use el siguiente comando para configurar una Integration con un punto de conexión HTTP especificado para el método GET /validation.

    aws apigateway put-integration --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --type HTTP \ --integration-http-method GET \ --request-parameters '{"integration.request.querystring.type" : "method.request.querystring.petType"}' \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'

    Use el siguiente comando para configurar una Integration con un punto de conexión HTTP especificado para el método POST /validation.

    aws apigateway put-integration --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --type HTTP \ --integration-http-method GET \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
  4. Use el siguiente comando para configurar la respuesta de integración para el método GET /validation.

    aws apigateway put-integration-response --rest-api-id abc123 \ --resource-id efg456\ --http-method GET \ --status-code 200 \ --selection-pattern ""

    Use el siguiente comando para configurar la respuesta de integración para el método POST /validation.

    aws apigateway put-integration-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --status-code 200 \ --selection-pattern ""
Para probar el API
  1. Para probar el método GET, que realizará la validación de la solicitud para las cadenas de consulta, utilice el siguiente comando:

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --path-with-query-string '/validate?petType=dog'

    El resultado devolverá 200 OK y una lista de perros.

  2. Use el siguiente comando para probar sin incluir la cadena de consulta petType.

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET

    El resultado devolverá un error 400.

  3. Para probar el método POST, que realizará la validación de la solicitud para el cuerpo de la solicitud, utilice el siguiente comando:

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'

    El resultado devolverá 200 OK y un mensaje de éxito.

  4. Use el siguiente comando para probar el uso de un cuerpo no válido.

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 1000 }'

    El resultado devolverá un error 400, ya que el precio del perro supera el precio máximo definido por el modelo.

Para eliminar una pila de AWS CloudFormation
  • Use el siguiente comando para eliminar los recursos AWS CloudFormation.

    aws cloudformation delete-stack --stack-name request-validation-tutorial-cli

Configuración de la validación básica de solicitudes con una definición de OpenAPI

Puede declarar un validador de solicitudes en el nivel de la API especificando un conjunto de objetos Objeto x-amazon-apigateway-request-validators.requestValidator en el mapa Objeto x-amazon-apigateway-request-validators para seleccionar qué parte de la solicitud se validará. En la definición de OpenAPI de ejemplo hay dos validadores:

  • El validador all, que valida tanto el cuerpo, utilizando el modelo de datos RequestBodyModel, como los parámetros.

    El modelo de datos RequestBodyModel exige que el objeto JSON de entrada contenga las propiedades name, type y price. La propiedad name puede ser cualquier cadena, type debe ser uno de los campos de la enumeración especificada (["dog", "cat", "fish"]) y price debe estar comprendido entre 25 y 500. El parámetro id no es obligatorio.

  • param-only, que valida solo los parámetros.

Para habilitar un validador de solicitudes en todos los métodos de una API, especifique una propiedad Propiedad x-amazon-apigateway-request-validator en el nivel de la API de la definición de OpenAPI. En el ejemplo de definición de OpenAPI, el validador all se usa en todos los métodos de la API, a menos que se invalide de otro modo. Cuando se utiliza un modelo para validar el cuerpo, si no se encuentra ningún tipo de contenido coincidente, no se realiza la validación de la solicitud. Para utilizar el mismo modelo independientemente del tipo de contenido, especifique $default como la clave.

Para habilitar un validador de solicitudes para un método individual, especifique la propiedad x-amazon-apigateway-request-validator en el nivel de método. En el ejemplo de definición de OpenAPI, el validador param-only anula el validador all del método GET.

Para importar el ejemplo de OpenAPI a API Gateway, consulte las siguientes instrucciones para Importación de una API regional en API Gateway o para Importación de una API optimizada para bordes en API Gateway.

OpenAPI 3.0
{ "openapi" : "3.0.1", "info" : { "title" : "ReqValidators Sample", "version" : "1.0.0" }, "servers" : [ { "url" : "/{basePath}", "variables" : { "basePath" : { "default" : "/v1" } } } ], "paths" : { "/validation" : { "get" : { "parameters" : [ { "name" : "q1", "in" : "query", "required" : true, "schema" : { "type" : "string" } } ], "responses" : { "200" : { "description" : "200 response", "headers" : { "test-method-response-header" : { "schema" : { "type" : "string" } } }, "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/ArrayOfError" } } } } }, "x-amazon-apigateway-request-validator" : "params-only", "x-amazon-apigateway-integration" : { "httpMethod" : "GET", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.querystring.type" : "method.request.querystring.q1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } }, "post" : { "parameters" : [ { "name" : "h1", "in" : "header", "required" : true, "schema" : { "type" : "string" } } ], "requestBody" : { "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/RequestBodyModel" } } }, "required" : true }, "responses" : { "200" : { "description" : "200 response", "headers" : { "test-method-response-header" : { "schema" : { "type" : "string" } } }, "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/ArrayOfError" } } } } }, "x-amazon-apigateway-request-validator" : "all", "x-amazon-apigateway-integration" : { "httpMethod" : "POST", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.header.custom_h1" : "method.request.header.h1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } } } }, "components" : { "schemas" : { "RequestBodyModel" : { "required" : [ "name", "price", "type" ], "type" : "object", "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "maximum" : 500.0, "minimum" : 25.0, "type" : "number" } } }, "ArrayOfError" : { "type" : "array", "items" : { "$ref" : "#/components/schemas/Error" } }, "Error" : { "type" : "object" } } }, "x-amazon-apigateway-request-validators" : { "all" : { "validateRequestParameters" : true, "validateRequestBody" : true }, "params-only" : { "validateRequestParameters" : true, "validateRequestBody" : false } } }
OpenAPI 2.0
{ "swagger" : "2.0", "info" : { "version" : "1.0.0", "title" : "ReqValidators Sample" }, "basePath" : "/v1", "schemes" : [ "https" ], "paths" : { "/validation" : { "get" : { "produces" : [ "application/json", "application/xml" ], "parameters" : [ { "name" : "q1", "in" : "query", "required" : true, "type" : "string" } ], "responses" : { "200" : { "description" : "200 response", "schema" : { "$ref" : "#/definitions/ArrayOfError" }, "headers" : { "test-method-response-header" : { "type" : "string" } } } }, "x-amazon-apigateway-request-validator" : "params-only", "x-amazon-apigateway-integration" : { "httpMethod" : "GET", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.querystring.type" : "method.request.querystring.q1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } }, "post" : { "consumes" : [ "application/json" ], "produces" : [ "application/json", "application/xml" ], "parameters" : [ { "name" : "h1", "in" : "header", "required" : true, "type" : "string" }, { "in" : "body", "name" : "RequestBodyModel", "required" : true, "schema" : { "$ref" : "#/definitions/RequestBodyModel" } } ], "responses" : { "200" : { "description" : "200 response", "schema" : { "$ref" : "#/definitions/ArrayOfError" }, "headers" : { "test-method-response-header" : { "type" : "string" } } } }, "x-amazon-apigateway-request-validator" : "all", "x-amazon-apigateway-integration" : { "httpMethod" : "POST", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.header.custom_h1" : "method.request.header.h1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } } } }, "definitions" : { "RequestBodyModel" : { "type" : "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "type" : "number", "minimum" : 25.0, "maximum" : 500.0 } } }, "ArrayOfError" : { "type" : "array", "items" : { "$ref" : "#/definitions/Error" } }, "Error" : { "type" : "object" } }, "x-amazon-apigateway-request-validators" : { "all" : { "validateRequestParameters" : true, "validateRequestBody" : true }, "params-only" : { "validateRequestParameters" : true, "validateRequestBody" : false } } }