Crear una API rest con Node.js y Express

Qué es una API Rest y cómo crear un endpoint sencillo con Node.js y Express

API REST

Introducción

¿Qué es una API REST?

En la actualidad, el diseño de API REST se ha convertido en un estándar para el desarrollo de aplicaciones web y servicios en la arquitectura de cliente-servidor. REST, que significa Transferencia de Estado Representacional (Representational State Transfer), es un conjunto de principios arquitectónicos que guían la creación de servicios web eficientes, escalables y fáciles de mantener.

El término "REST" fue acuñado por Roy Fielding en su tesis doctoral en el año 2000. Fielding, uno de los coautores del protocolo HTTP (Hypertext Transfer Protocol), ideó los principios REST para describir cómo los sistemas pueden comunicarse a través de la web de manera eficiente. Estos principios han ganado amplia aceptación en la comunidad de desarrollo de software.

Métodos HTTP en REST

Los métodos HTTP en una API REST definen las acciones que se pueden llevar a cabo sobre los "recursos" que la API expone. En el contexto de una API REST, un "recurso" es una unidad de información o entidad identificable, como un usuario, un producto o cualquier otro conjunto de datos. Cada método HTTP (GET, POST, PUT, DELETE, etc.) se asocia con una operación específica sobre estos recursos. Los métodos principales son:

  • GET: Recupera información de un recurso específico. Es idempotente, lo que significa que múltiples solicitudes no cambian el estado del servidor.

  • POST: Crea un nuevo recurso. Se utiliza para enviar datos al servidor para su procesamiento.

  • PUT: Actualiza un recurso existente o crea uno si no existe. Es idempotente, ya que realizar la misma operación varias veces produce el mismo resultado que hacerlo una vez.

  • DELETE: Elimina un recurso específico. Al igual que GET, es idempotente.

  • PATCH: Aplica parcialmente modificaciones a un recurso. Es útil cuando solo se necesitan realizar cambios específicos en lugar de enviar el recurso completo.

  • OPTIONS: Proporciona información sobre las opciones de comunicación disponibles para el recurso identificado.

Node.js y Express

Para implementar la API necesitaremos Node.js y el servidor web Express.js

Node.js es un entorno de ejecución de JavaScript del lado del servidor que utiliza el motor V8 de Google Chrome. La singularidad de Node.js radica en su capacidad para ejecutar código JavaScript en el servidor, permitiendo la creación de aplicaciones altamente escalables y orientadas a eventos.

Express.js, por otro lado, es un servidor web para Node.js. Se construye sobre la base de las funciones básicas de Node.js, simplificando la creación de aplicaciones web y APIs REST.

También ayuda que la comunidad es muy activa y el robusto y extenso ecosistema de paquetes de Node.js, a través de NPM, contribuyen a su atractivo y popularidad.

Crear una applicación Node.js

Prerequisitos del sistema

Antes de continuar debes asegurarte de tener el entorno configurado. Concretamente necesitamos que el sistema tenga instalado Node.js y npm. Puedes comprobar si los tienes instalados ejecutando los comandos

node -v
npm -v

Si no tienes instalado Node.js puedes seguir este artículo para instalar NVM (Node Version Manager) y Node.js Y para instalar npm:

npm install -g npm

Creación de un nuevo proyecto Node.js

El primer paso será crear una carpeta donde residirán los archivos de nuestra aplicación. Puedes usar este comando para crear la carpeta:

mkdir api-rest

Accedemos dentro del directorio

cd api-rest

Inicializar la aplicación

Para inicializar la aplicación podemos ejecutar el comando:

npm init

Se iniciará la creación de la aplicación y te preguntará el nombre de la aplicación y otros parámetros. Puedes aceptar los parámetros por defecto pulsando la tecla Enter.

Una vez creada la aplicación verás que se ha creado un archivo llamado package.json que contiene la información proporcionada, y además describe cómo se ejecutará el proyecto y la lista de dependencias.

{
  "name": "api-rest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Instalar dependencias

Para instalar Express.js, ejecutamos este comando en la terminal:

npm install express

Si volvemos a abrir el archivo package.json veremos que se ha añadido la dependencia (la versión puede variar si no se especifica al instalarla).

"dependencies": {
  "express": "^4.18.2"
}

y también se ha creado un archivo llamado package-lock.json, un archivo que contiene el registro de las dependencias instaladas.

Iniciar el servidor y crear un endpoint

Creamos un archivo llamado index.js y pegamos este código:

Primero importamos la dependencia Express.js y se creamos una instancia de la aplicación llamada app.

const express = require('express');
const app = express();

Utilizamos el middleware express.json() para permitir que la aplicación pueda interpretar datos en formato JSON que se envían en las solicitudes.

app.use(express.json());

Configuramos el puerto en el que el servidor escuchará las solicitudes. Si hay una variable de entorno llamada PORT definida, utilizará ese valor; de lo contrario, usará el puerto 8080 por defecto.

const PORT = process.env.PORT || 8080;

Iniciamos el servidor y empieza a escuchar en el puerto especificado. Cuando el servidor está listo para recibir solicitudes, se imprime en la consola el mensaje 'servidor iniciado'.

app.get('/hola', function (req, response) {
  response.send('mundo');
});

Definimos un nuevo enpoint para las solicitudes GET en la ruta '/hola'. Cuando se recibe una solicitud en esta ruta, la aplicación responde con el texto 'mundo'.

Ejecutar el servidor

Para probar el código implementado, en la línea de comandos ejecutamos:

node index.js

con el navegador nos podemos dirigir a la url http://localhost:8080/hola y veremos el texto

mundo

Código completo

const express = require('express');
const app = express();
app.use(express.json());
const PORT = process.env.PORT || 8080;

app.listen(PORT, function () {
  console.log('servidor iniciado')
})

app.get('/hola', function (req, response) {
  response.send('mundo');
})