Configurar una solicitud de método en API Gateway
Configurar una solicitud de método implica realizar las siguientes tareas, después de la creación de un recurso RestApi:
-
Creación de una nueva API o elección de una entidad Resource de API existente.
-
Creación de un recurso Method de API que sea un verbo HTTP específico en el
Resource
nuevo o elegido de la API. Esta tarea se puede dividir aún más en las siguientes subtareas:-
Añadido de un método HTTP a la solicitud de métodos
-
Configuración de parámetros de solicitudes
-
Definición de un modelo para el cuerpo de la solicitud
-
Aplicación de un esquema de autorización
-
Habilitación de la validación de la solicitud
-
Puede realizar estas tareas con los siguientes métodos:
-
Comandos de la AWS CLI (create-resource y put-method)
-
Función del SDK de AWS (como, en Node.js, createResource y putMethod)
-
API REST de API Gateway (resource:create y method:put).
Temas
Configurar recursos de API
En una API de API Gateway, los recursos que se pueden dirigir se exponen como un árbol de entidades Resources de API, con el recurso de raíz (/
) en la parte superior de la jerarquía. El recurso de raíz depende de la URL base de la API, que se compone del punto de enlace de la API y un nombre de etapa. En la consola de API Gateway, este URI base se denomina Invoke URI y se muestra en el editor de etapas de la API una vez que se implementa la API.
El punto de enlace de la API puede ser un nombre de host predeterminado o un nombre de dominio personalizado. El nombre de host predeterminado tiene el siguiente formato:
{api-id}
.execute-api.{region}
.amazonaws.com
En este formato, la {api-id}
representa el identificador de la API que genera API Gateway. La variable
representa la región de AWS (por ejemplo, {region}
us-east-1
) que eligió al crear la API. Un nombre de dominio personalizado es cualquier nombre fácil de recordar en un dominio de Internet válido. Por ejemplo, si ha registrado un dominio de Internet de example.com
, *.example.com
es un nombre de dominio personalizado válido. Para obtener más información, consulte configurar nombres de dominio personalizados.
Para la API de ejemplo de PetStore, el recurso de raíz (/
) expone la tienda de mascotas. El recurso /pets
representa la variedad de mascotas disponibles en la tienda. El /pets/{petId}
expone una mascota individual de un identificador concreto (petId
). El parámetro de la ruta de {petId}
forma parte de los parámetros de solicitudes.
Para configurar un recurso de API, se elige un recurso existente como principal y, a continuación, se crea el recurso secundario bajo el recurso principal. Se empieza con el recurso raíz como principal, se añade un recurso a este principal, se añade otro recurso a este recurso secundario como nuevo principal, etc., a su identificador principal. A continuación, se añade el recurso designado al principal.
Con la AWS CLI, puede llamar al comando get-resources
para averiguar qué recursos de una API están disponibles:
aws apigateway get-resources --rest-api-id
<apiId>
\ --region<region>
El resultado es una lista de los recursos disponibles de la API actualmente. En la API de nuestro ejemplo de PetStore, esta lista sería similar a la siguiente:
{ "items": [ { "path": "/pets", "resourceMethods": { "GET": {} }, "id": "6sxz2j", "pathPart": "pets", "parentId": "svzr2028x8" }, { "path": "/pets/{petId}", "resourceMethods": { "GET": {} }, "id": "rjkmth", "pathPart": "{petId}", "parentId": "6sxz2j" }, { "path": "/", "id": "svzr2028x8" } ] }
Cada elemento enumera los identificadores del recurso (id
) y, excepto el recurso raíz, su recurso principal inmediato (parentId
), así como el nombre del recurso (pathPart
). El recurso raíz es especial, ya que no tiene ninguno principal. Después de elegir un recurso como principal, llame al siguiente comando para añadir un recurso secundario.
aws apigateway create-resource --rest-api-id
<apiId>
\ --region<region>
\ --parent-id<parentId>
\ --path-part<resourceName>
Por ejemplo, para añadir alimentos de mascotas para la venta en el sitio web de PetStore, añada un recurso food
a la raíz (/), estableciendo path-part
para food
y parent-id
para svzr2028x8
. El resultado es similar al siguiente:
{ "path": "/food", "pathPart": "food", "id": "xdsvhp", "parentId": "svzr2028x8" }
Utilizar un recurso proxy para simplificar la configuración de API
A medida que crece el negocio, el propietario de PetStore puede que decida añadir a la venta alimentos, juguetes y otros artículos relacionados con mascotas. Para sustentarlo, puede añadir /food
, /toys
y otros recursos debajo del recurso raíz. Debajo de cada categoría de venta, es posible que también desee añadir más recursos, como por ejemplo /food/{type}/{item}
, /toys/{type}/{item}
, etc. Esto puede ser una tarea tediosa. Si decide añadir una capa intermedia {subtype}
a las rutas de recursos para cambiar la jerarquía de rutas a /food/{type}/{subtype}/{item}
, /toys/{type}/{subtype}/{item}
, etc., los cambios afectarán a la configuración existente de la API. Para evitarlo, puede utilizar un recurso de proxy de API Gateway para exponer un conjunto de recursos de la API a la vez.
API Gateway define un recurso de proxy como un marcador de posición para que un recurso se especifique cuando se envíe la solicitud. Un recurso de proxy se expresa mediante un parámetro de ruta especial de {proxy+}
, a menudo denominado parámetro de ruta expansiva. El signo +
indica los recursos secundarios que lleva asociados. El marcador de posición /parent/{proxy+}
equivale a cualquier recurso que coincida con el patrón de ruta de /parent/*
. El nombre de parámetro de ruta expansiva, proxy
, se puede sustituir con otra cadena, del mismo modo que se trata un nombre de parámetro de ruta normal.
Con la AWS CLI, llama al siguiente comando para configurar un recurso de proxy bajo la raíz (/{proxy+}
):
aws apigateway create-resource --rest-api-id
<apiId>
\ --region<region>
\ --parent-id<rootResourceId>
\ --path-part {proxy+}
El resultado es similar al siguiente:
{ "path": "/{proxy+}", "pathPart": "{proxy+}", "id": "234jdr", "parentId": "svzr2028x8" }
Para el ejemplo de API de PetStore
, puede utilizar /{proxy+}
para representar tanto /pets
como /pets/{petId}
. Este recurso de proxy también puede hacer referencia a cualquier otro recurso (existente o que se vaya a añadir), como por ejemplo /food/{type}/{item}
, /toys/{type}/{item}
, etc., o /food/{type}/{subtype}/{item}
, /toys/{type}/{subtype}/{item}
, etc. El desarrollador del backend determina la jerarquía de recursos y el desarrollador cliente es responsable de comprenderlo. API Gateway simplemente transfiere lo que envíe el cliente al backend.
Una API puede tener más de un recurso de proxy. Por ejemplo, los siguientes recursos de proxy están permitidos dentro de una API, lo que supone que /parent/{proxy+}
no está en el mismo segmento principal que /parent/{child}/{proxy+}
.
/{proxy+} /parent/{proxy+} /parent/{child}/{proxy+}
Cuando un recurso de proxy tiene elementos secundarios que no son de proxy, los recursos secundarios se excluyen de la representación del recurso de proxy. En los ejemplos anteriores, /{proxy+}
hace referencia a cualquier recurso bajo el recurso raíz, excepto los recursos /parent[/*]
. En otras palabras, una solicitud de método realizada para un recurso específico prevalece sobre una solicitud de método realizada para un recurso genérico en el mismo nivel de la jerarquía de recursos.
Un recurso de proxy no puede tener cualquier recurso secundario. Un recurso de API después de {proxy+}
es redundante y ambiguo. Los siguientes recursos de proxy no se permiten dentro de una API.
/{proxy+}/child /parent/{proxy+}/{child} /parent/{child}/{proxy+}/{grandchild+}
Configurar un método HTTP
Una solicitud de métodos de API se encapsula mediante el recurso Method de API Gateway. Para configurar la solicitud de método, primero debe iniciar el recurso Method
, configurando al menos un método HTTP y un tipo de autorización en el método.
API Gateway, estrechamente asociado con el recurso de proxy, admite un método HTTP de ANY
. Este método ANY
representa cualquier método HTTP que se suministre en el tiempo de ejecución. Le permite utilizar una sola configuración de método de API para todos los métodos HTTP admitidos de DELETE
, GET
, HEAD
, OPTIONS
, PATCH
, POST
y PUT
.
También puede configurar el método ANY
en un recurso que no sea de proxy. Al combinar el método ANY
con un recurso de proxy, obtiene una configuración de método de API único para todos los métodos compatibles con HTTP frente a cualquier recurso de una API. Además, el backend puede evolucionar sin que afecte a la configuración de API existente.
Antes de configurar un método de API, tenga en cuenta quién puede llamar al método. Establezca el tipo de autorización según su plan. Para un acceso abierto, establézcalo en NONE
. Para utilizar permisos de IAM, establezca el tipo de autorización en AWS_IAM
. Para utilizar una función de autorizador de Lambda, establezca esta propiedad en CUSTOM
. Para utilizar un grupo de usuarios de Amazon Cognito, establezca el tipo de autorización en COGNITO_USER_POOLS
.
El siguiente comando de la AWS CLI muestra cómo crear una solicitud de método del verbo ANY
frente a un recurso especificado (6sxz2j
), mediante los permisos de IAM para controlar su acceso.
aws apigateway put-method --rest-api-id vaz7da96z6 \ --resource-id 6sxz2j \ --http-method ANY \ --authorization-type AWS_IAM \ --region us-west-2
Para crear una solicitud de método de API con un tipo de autorización distinta, consulte Configurar la autorización de solicitud de método.
Configurar parámetros de solicitud de método
Los parámetros de solicitud de método son una forma para que un cliente proporcione los datos de entrada o el contexto de ejecución necesarios para completar la solicitud de métodos. Un parámetro de método puede ser un método de ruta, un encabezado o un parámetro de cadena de consulta. Como parte de la configuración de solicitud de método, debe declarar los parámetros de solicitud necesarios para que estén disponibles para el cliente. Para la integración que no sea de proxy, puede traducir estos parámetros de solicitud en un formato que sea compatible con el requisito del backend.
Por ejemplo, para la solicitud de métodos GET /pets/{petId}
, la variable de ruta {petId}
es un parámetro de solicitud necesario. Puede declarar este parámetro de ruta cuando llame al comando put-method
de la AWS CLI. Esto se detalla de la siguiente manera:
aws apigateway put-method --rest-api-id vaz7da96z6 \ --resource-id rjkmth \ --http-method GET \ --authorization-type "NONE" \ --region us-west-2 \ --request-parameters method.request.path.petId=true
Si un parámetro no es necesario, puede establecerlo en false
en request-parameters
. Por ejemplo, si el método GET /pets
utiliza un parámetro de cadena de consulta opcional de type
y un parámetro de encabezado opcional de breed
, puede declararlos usando el siguiente comando de la CLI, suponiendo que el recurso /pets
sea id
6sxz2j
:
aws apigateway put-method --rest-api-id vaz7da96z6 \ --resource-id 6sxz2j \ --http-method GET \ --authorization-type "NONE" \ --region us-west-2 \ --request-parameters method.request.querystring.type=false,method.request.header.breed=false
En lugar de esta forma abreviada, puede utilizar una cadena de JSON para establecer el valor request-parameters
:
'{"method.request.querystring.type":false,"method.request.header.breed":false}'
Con esta configuración, el cliente puede consultar las mascotas por tipo:
GET /pets?type=dog
Además, el cliente puede consultar los perros de raza caniche de la siguiente manera:
GET /pets?type=dog breed:poodle
Para obtener información sobre cómo asignar parámetros de solicitud de método a parámetros de solicitud de integración, consulte Integraciones para las API de REST en API Gateway.
Configuración de un modelo de solicitud de método
Para un método de API que pueda tomar datos de entrada en una carga, puede utilizar un modelo. Un modelo se expresa en un esquema JSON, borrador 4
En función de los tipos de contenido, una carga de método puede tener diferentes formatos. Un modelo se indexa frente al tipo de medio de la carga aplicada. API Gateway utiliza el encabezado de la solicitud Content-Type
para determinar el tipo de contenido. Para configurar modelos de solicitud de método, añada pares de clave-valor con el formato "
al mapa <media-type>
":"<model-name>
"requestModels
cuando llame al comando put-method
de la AWS CLI.
Para utilizar el mismo modelo independientemente del tipo de contenido, especifique $default
como la clave.
Por ejemplo, para establecer un modelo en la carga de JSON de la solicitud de método POST /pets
de la API de ejemplo de PetStore, puede llamar al siguiente comando de la AWS CLI:
aws apigateway put-method \ --rest-api-id vaz7da96z6 \ --resource-id 6sxz2j \ --http-method POST \ --authorization-type "NONE" \ --region us-west-2 \ --request-models '{"application/json":"petModel"}'
Aquí, petModel
es el valor de propiedad name
de un recurso Model
que describe una mascota. La definición del esquema real se expresa como un valor de cadena JSON de la propiedad schema
del recurso Model
.
En un SDK Java de la API, u otro tipo de SDK con establecimiento inflexible de tipos, los datos de entrada se forman como la clase petModel
derivada de la definición del esquema. Con el modelo de solicitud, los datos de entrada en el SDK generado se forman en la clase Empty
, que se deriva del modelo Empty
predeterminado. En este caso, el cliente no puede crear una instancia de la clase de datos correcta para proporcionar la entrada necesaria.
Configurar la autorización de solicitud de método
Para controlar quién puede llamar al método de la API, puede configurar el tipo de autorización en el método. Puede utilizar este tipo para aplicar uno de los autorizadores admitidos, incluidos roles y políticas de IAM (AWS_IAM
), un grupo de usuarios de Amazon Cognito (COGNITO_USER_POOLS
), o un autorizador de Lambda basado en funciones de Lambda (CUSTOM
).
Para utilizar permisos de IAM para autorizar el acceso al método de la API, establezca la propiedad de entrada authorization-type
en AWS_IAM
. Cuando esta opción está establecida, API Gateway verifica la firma del intermediario en la solicitud en función de las credenciales del intermediario. Si el usuario verificado tiene permiso para llamar al método, se acepta la solicitud. De lo contrario, rechaza la solicitud y el intermediario recibe una respuesta de error no autorizado. La llamada al método no se realiza correctamente a menos que el intermediario tenga permiso para invocar el método de la API. La siguiente política de IAM concede permiso al intermediario para llamar a cualquier método de API creado dentro de la misma Cuenta de AWS:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": "arn:aws:execute-api:*:*:*" } ] }
Para obtener más información, consulte Control del acceso a una API de REST con permisos de IAM.
Actualmente, solo puedes conceder esta política a los usuarios, grupos y roles de la Cuenta de AWS del propietario de la API. Los usuarios de una Cuenta de AWS diferente pueden llamar a los métodos de la API solo si se les permite asumir un rol de la Cuenta de AWS del propietario de la API con los permisos necesarios para llamar a la acción execute-api:Invoke
. Para obtener más información sobre los permisos entre cuentas, consulte Uso de roles de IAM.
Puede utilizar la AWS CLI, un AWS SDK o un cliente de API de REST, como Postman
Para utilizar un autorizador de Lambda con el fin de autorizar el acceso al método de la API, establezca la propiedad de entrada authorization-type
en CUSTOM
y establezca la propiedad de entrada authorizer-id
en el valor de propiedad id
de un autorizador de Lambda que ya exista. El autorizador de Lambda al que se hace referencia puede ser del tipo TOKEN
o REQUEST
. Para obtener información acerca de cómo crear un autorizador de Lambda, consulte Uso de autorizadores Lambda de API Gateway.
Para utilizar un grupo de usuarios de Amazon Cognito con el fin de autorizar el acceso al método de la API, establezca la propiedad de entrada authorization-type
en COGNITO_USER_POOLS
y establezca la propiedad de entrada authorizer-id
en el valor de propiedad id
del autorizador COGNITO_USER_POOLS
que ya se creó. Para obtener información sobre la creación de un autorizador de grupo de usuarios de Amazon Cognito, consulte Control del acceso a las API de REST con grupos de usuarios de Amazon Cognito como autorizador.
Configurar la validación de solicitud de método
Puede habilitar la validación de solicitud al configurar una solicitud de método de API. Primero tiene que crear un validador de solicitudes:
aws apigateway create-request-validator \ --rest-api-id 7zw9uyk9kl \ --name bodyOnlyValidator \ --validate-request-body \ --no-validate-request-parameters
Este comando de la CLI crea un validador de solicitud de solo cuerpo. A continuación, se muestra un ejemplo de resultado:
{ "validateRequestParameters": false, "validateRequestBody": true, "id": "jgpyy6", "name": "bodyOnlyValidator" }
Con este validador de solicitud, puede habilitar la validación de solicitud como parte de la configuración de solicitud de método:
aws apigateway put-method \ --rest-api-id 7zw9uyk9kl --region us-west-2 --resource-id xdsvhp --http-method PUT --authorization-type "NONE" --request-parameters '{"method.request.querystring.type": false, "method.request.querystring.page":false}' --request-models '{"application/json":"petModel"}' --request-validator-id jgpyy6
Para que se incluya en la validación de solicitud, debe declararse un parámetro de solicitud como sea necesario. Si el parámetro de cadena de consulta de la página se utiliza en la validación de solicitud, el mapa de request-parameters
del ejemplo anterior debe especificarse como '{"method.request.querystring.type": false,
"method.request.querystring.page":true}'
.