Fake Api – Generar servicios HTTP Rest en NodeJS para simular micro servicios

Fake Api – Generar servicios HTTP Rest en NodeJS para simular micro servicios

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

PropiedadDescripción
nameSimplemente el nombre del servicio, no es necesario, simplemente se imprime en un log y como descripción al iniciar el servicio.
portEs el numero de puerto donde se creara el servicio, si este es menor a 80 entonces no se creara el servicio.
pathsArray que describen las rutas que se van a generar para el servicio
pathRuta a la cual responderá una petición.
methodsArray de todos los metodos o verbos http que soportara una ruta
methodNombre 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.
responseDentro tiene propiedades que describen la respuesta de la ruta.
statusEs el código http de la respuesta a la petición.
bodyPropiedad de respuesta a la petición y puede contener cualquier valor y/o propiedad.
headersLas cabeceras de respuesta a la peticion, en caso de no existir esta propiedad por default agregara la respuesta. “Content-Type”: “application/json”
notFoundContiene 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.

Puedes clonar el proyecto desde aquí.