Esta semana, tuve que poner en marcha varios micro servicios, algunos de ellos estaban en imágenes Docker y en la mayoría de los casos, sólo necesitaba hacer una o dos consultas, ya que estaba buscando datos específicos, como realizar un login o validar cierta información.
Lo que hice fue desarrollar un código sencillo en NodeJS que puede generar uno o varios micro servicios a partir de un archivo JSON y retornar los datos que necesite. Elegí NodeJS porque me permite crear un servicio HTTP desde cero, sin dependencias ni abstracciones. Aunque hay otros lenguajes que también lo permiten, algunos tienen más abstracciones que otros.
El archivo JSON solo es un Array donde se especifica el nombre, puerto y rutas para generar los servicios.
Código
Es muy simple y esta escrito en un solo archivo debido a que no es demasiado extenso, y no tiene dependencias mas que prettier que me sirve para formatear el código, pero es dependencia de desarrollo por lo que se puede prescindir de ella.
Todos los servicios que se generan tiene una validación de tipo OPTIONS, en caso de haber problemas de tipo CORS y lo demás son solo búsquedas de las rutas y métodos que hay en el archivo JSON.
El archivo de configuración JSON debe llamarse servers.json, y así debe ser nombrado ya que esta ligado al código, pero cambiarlo es trivial y la misma referencia al nombre esta en el archivo .gitignore para que este no se suba al repositorio y el código sea mas limpio.
Las peticiones se resuelven con rutas exactas no permite comodines ni parámetros, y tampoco valida el contenido de una petición, esto por que no quise complicar el código con eventos y/o promesas para leer el body, ademas de que lo único que me interesaba es el contenido de la respuesta.
Si se necesita enviar query params entonces hay que agregarlo tal cual se van a enviar esto por la validación exacta de rutas.
Ejecutar el código
Recomiendo hacer uso de nodemon, ya que asi pueden cambiar el archivo JSON y automáticamente se reflejan los cambios en los servicios.
npm i -g nodemon
node index.js
nodemon index.js
Salida ejecutando nodemon y el archivo JSON de ejemplo.
Ejemplo JSON
[
{
"name": "server 1",
"notFound": {
"status": 404,
"body": {
"error": "not_found"
}
},
"port": 3000,
"paths": [
{
"path": "/profile",
"methods": [
{
"method": "get",
"response": {
"status": 200,
"body": {
"id": "123456789",
"name": "John Doe"
},
"headers": {
"Content-Type": "application/json"
}
}
}
]
}
]
},
{
"name": "server 2",
"notFound": {
"status": 404,
"body": {
"error": "not_found"
}
},
"port": 4000,
"paths": [
{
"path": "/login",
"methods": [
{
"method": "post",
"response": {
"status": 200,
"body": {
"token": "123456789"
}
}
}
]
}
]
}
]
Propiedades del JSON
Propiedad | Descripción |
name | Simplemente el nombre del servicio, no es necesario, simplemente se imprime en un log y como descripción al iniciar el servicio. |
port | Es el numero de puerto donde se creara el servicio, si este es menor a 80 entonces no se creara el servicio. |
paths | Array que describen las rutas que se van a generar para el servicio |
path | Ruta a la cual responderá una petición. |
methods | Array de todos los metodos o verbos http que soportara una ruta |
method | Nombre del método o verbo http que soportara una ruta, pueden ser los típicos, GET, PUT, POST, DELETE, pero por la manera que esta escrito el código puede ser cualquier texto. La condición es deben ser en minúsculas nada mas. |
response | Dentro tiene propiedades que describen la respuesta de la ruta. |
status | Es el código http de la respuesta a la petición. |
body | Propiedad de respuesta a la petición y puede contener cualquier valor y/o propiedad. |
headers | Las cabeceras de respuesta a la peticion, en caso de no existir esta propiedad por default agregara la respuesta. “Content-Type”: “application/json” |
notFound | Contiene solo un body y un status que el servidor responderá en caso de no encontrar una ruta valida. |
El archivo JSON anterior genera dos servicios, uno escuchando en el puerto 3000 y otro en el puerto 4000 y dos rutas que responden.
curl --location 'http://localhost:3000/profile'
curl --location --request POST 'http://localhost:4000/login'
Eso es todo lo que hace el código, no es nada del otro mundo ni nada complejo, me llevo mas tiempo escribir esta entrada que programarlo >D,
Espero les sea de utilidad para múltiples proyectos, incluso debería servir en ambientes productivos y con alta carga ya que todo se ejecuta en memoria ram.
2 thoughts on “Fake Api – Generar servicios HTTP Rest en NodeJS para simular micro servicios”