Modelos API Gateway
Tags: aws, serverless, apigateway
Published: 2021-12-31 16:12:59

Los modelos en API Gateway nos sirven para validar que los datos enviados a nuestro método sean los que definimos o necesitamos para su correcto funcionamiento y así evitar que se hagan llamadas innecesarias a nuestro backend.

Esta validación la realizamos por medio de JSON Schema que nos ayuda validar archivos JSON.

Veamos cómo realizar esta validación en nuestros métodos de API Gateway.

En este ejemplo vamos a crear un API Rest para ingresar los datos de un usuario:

* Nombre 
* Apellido
* Edad
* Dirección

Vamos a empezar con la creación del API Rest.

1.Buscamos el servicio API Gateway y damos click en el botón
Create API.

![Create Api]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/create%20api%20button.png)

2.Este este caso crearemos un API del tipo API Rest. Las Api rest son utilizadas generalmente para aplicaciones web o implementaciones de microservicios.

![Select type api]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/select%20api.png)

3.Asignamos el nombre: **UserApi**. Al crear un api tenemos diferentes opciones como crear una nueva api (este caso) o importar el api desde otras herramientas.

![Asign name api]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/asign%20name%20api.png)

4.Ya teniendo nuestra api creada el siguiente paso que debemos realizar es crear un nuevo recurso. Los recursos nos  sirven para organizar de una manera adecuada nuestro api.

![create resource]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/create%20resource.png)

Asignamos el nombre a nuestro recurso

![create resource]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/asing%20name%20resource.png)

Si vamos a utilizar nuestra api desde una aplicación angular, React.js,Vue.js o desde cualquier tipo de front end debemos habilitar la casilla: **Enable API Gateway CORS**

5.Después de tener nuestro recurso creado debemos crear el método que va a ser utilizado para el registro de nuestros usuarios.

![create method 1]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/create%20method%201.png)

Para nuestro caso vamos a utilizar un método tipo POST que es utilizado para el ingreso de datos (inserciones).

![create method 2]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/create%20method%202.png)

Después de crear nuestro método debemos seleccionar el tipo de integración que queremos en nuestro método,  vamos a seleccionar en este caso Mock, ya que nos permite imitar una llamada real. Generalmente para aplicaciones web se utiliza la integración con funciones lambda.

![integration]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/integration%20method.png)


6.Ahora vamos a crear nuestro modelo, con el objetivo de validar los datos que llegan a nuestro método antes que se llame al backend.

![create model]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/create%20model.png)

En nuestro esquema colocamos los datos, el tipo del dato y cuales son obligatorios.

```
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Validar Usuario",
  "description": "Validar los datos del usuario",
  "type": "object",
  "properties": {
    "Nombre": {
      "type": "string"
    },
    "Apellido": {
      "type": "string"
    },
    "Edad": {
      "type": "integer"
    },
    "Dirección": {
      "description": "Dirección de residencia del usuario",
      "type": "string"
    }
  },
  "required": [ "Nombre", "Apellido","Edad" ]
}

```
En el esquema definimos que vamos a recibir 4 datos:Nombre (string),Apellido (string),Edad (numérico) y Dirección (string) de los cuales hay 3 campos obligatorios que son Nombre, Apellido y Edad.

7.Teniendo nuestro modelo vamos a asignarlo a nuestro método.

![set model]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/set%20model.png)

añadimos nuestro modelo al metodo

![set model 1]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/set%20model%201.png)

8.Ahora que hemos configurado nuestro api, configurado nuestro modelo y haberlo asignado a nuestro método, debemos hacer nuestras pruebas para validar que todo este funcionando correctamente.

![test 1]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/test%201.png)

Realizamos la prueba sin enviar ningún parámetro. Podemos observar que la respuesta es **invalid request body**, debido a que no se envío ningún dato al método.

![test 2]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/test%202.png)

Ahora vamos a realizar una petición con la datos que requiere el modelo para pasar la validación.

![test 3]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/test%203.png)

```
{
    "Nombre": "string",
    "Apellido":  "string",
    "Edad": 100
}
```

Ahora que enviamos los datos de acuerdo a como están definidos en el modelo podemos ver que la respuesta es exitosa.

Como ejercicio pueden realizar una nueva petición quitando un parámetro requerido o incluyendo el campo Dirección.


# Referencias
[JSON Schema](http://json-schema.org/learn/getting-started-step-by-step)


Me pueden encontrar en

[Camilo Cabrales](https://www.linkedin.com/in/camilo-cabrales-31a0bb53/)