Construye tu primera API REST con Node.js: guía completa para principiantes
Aprende a crear un servidor de API REST funcional con Node.js y Restify, desde la instalación hasta el manejo de peticiones GET y POST con ejemplos del mundo real.
Introducción: ¿Por qué Node.js para el desarrollo backend?
Si has estado siguiendo el proyecto del servidor de programación, ya sabes que Node.js es una plataforma increíblemente potente para crear aplicaciones del lado del servidor. Pero si estás empezando, puede que te preguntes: ¿por qué Node.js? ¿Por qué no quedarse con los lenguajes tradicionales del lado del servidor?
La respuesta está en el modelo de E/S dirigido por eventos y sin bloqueo de Node.js, que lo hace increíblemente eficiente para gestionar conexiones simultáneas, perfecto para aplicaciones web modernas que necesitan manejar datos en tiempo real, APIs y microservicios.
En este tutorial, recorreremos la creación de tu primer servidor con una API REST usando Node.js y el framework Restify. Al final, tendrás un servidor funcional que podrá aceptar peticiones POST, almacenar datos y servirlos de vuelta mediante peticiones GET.
Paso 1: Instalar Node.js y NPM
Antes de escribir cualquier código, necesitamos preparar nuestro entorno de desarrollo. El proceso es muy sencillo:
En macOS (método recomendado)
Si estás en un Mac, te recomiendo encarecidamente usar Homebrew: es la forma más fácil de gestionar las instalaciones de Node.js:
brew install node
Este único comando instalará tanto Node.js como NPM (Node Package Manager), que necesitaremos para instalar frameworks y paquetes.
Verificación
Después de la instalación, verifica que todo funciona:
node --version
npm --version
Deberías ver los números de versión de ambos, lo que confirma que la instalación se ha realizado correctamente.
Paso 2: Entender la elección del framework
Node.js incluye capacidades de servidor HTTP integradas, pero escribir código de servidor HTTP sin procesar puede complicarse rápidamente. Ahí es donde entran en juego frameworks como Restify y Express.
Restify vs. Express: ¿cuál es la diferencia?
- Express es un framework web completo que puede manejar desde el enrutamiento hasta el uso de plantillas, lo que lo hace ideal para construir aplicaciones web completas.
- Restify es un framework más ligero diseñado específicamente para crear APIs RESTful. Se centra en lo esencial: endpoints, métodos HTTP y manejo de JSON.
Para nuestro proyecto de programación, estamos usando Restify porque necesitamos un endpoint de API limpio sin la sobrecarga de un servidor web completo.
Paso 3: Construir tu primer servidor
Comencemos con un servidor básico de tipo "Hola Mundo" usando Restify:
var restify = require('restify');
var server = restify.createServer({
name: 'scheduler-api'
});
server.get('/test', function(req, res, next) {
res.send('Test endpoint working!');
next();
}); --max-tokens 8192 --no-fallback --system You are a deterministic professional translator. Return only the requested final JSON object. Do not include reasoning or commentary.
Guarda esto como index.js y ejecútalo con node index.js. Luego visita http://localhost:8080/test en tu navegador—¡deberías ver tu mensaje!
Paso 4: Entendiendo GET vs POST
Antes de profundizar en las solicitudes POST, aclaremos la diferencia entre los métodos HTTP:
Solicitudes GET
GET se utiliza para recuperar datos del servidor. Envías una URL (opcionalmente con parámetros de consulta), y el servidor responde con datos. Esto es lo que acabamos de hacer con nuestro endpoint /test.
Solicitudes POST
POST se utiliza para enviar datos al servidor. En lugar de simplemente solicitar datos, estás enviando un payload que el servidor puede procesar, almacenar o con el que puede actuar. Esto es esencial para nuestro scheduler, que necesita aceptar elementos de programación de los clientes.
Paso 5: Creando un Endpoint POST
Ahora vamos a añadir un endpoint POST a nuestro servidor:
server.post('/upload/test', function(req, res, next) {
console.log('Received POST request');
console.log('Body:', req.body);
res.send(200, { status: 'ok' });
next();
});
Fíjate en algunas cosas clave:
- El primer parámetro es la ruta del endpoint:
/upload/test
- El segundo parámetro es una función callback que maneja la solicitud
req contiene los datos de la solicitud entrante, incluyendo el body
res se utiliza para enviar respuestas de vuelta al cliente
next() es importante para el encadenamiento de middleware en Restify
Paso 6: Probando tu Endpoint POST
No puedes probar solicitudes POST en tu navegador como las solicitudes GET—necesitas un cliente HTTP adecuado. Recomiendo Advanced REST Client, una extensión de Chrome que hace que probar APIs sea simple e intuitivo.
Configurando tu Solicitud
- Establece el método a POST
- Introduce tu URL:
http://localhost:8080/upload/test
- Establece Content-Type a
application/json
- Añade tu payload JSON en el body
Importante: ¡La Sintaxis de JSON Importa!
Cuando crees payloads JSON manualmente, recuerda que JSON requiere comillas dobles para las cadenas, no comillas simples:
{"test": "This is valid JSON"}
No esto:
{'test': 'This will cause errors'}
Usa herramientas como JSONLint para validar tu JSON antes de enviar solicitudes.
Paso 7: Leyendo y Almacenando Datos de Solicitud
Ahora que podemos recibir solicitudes POST, vamos a almacenar realmente los datos.
Para este tutorial, usaremos almacenamiento en memoria (que se reiniciará cuando el servidor se reinicie—cubriremos el almacenamiento persistente con MongoDB en el próximo tutorial).
// Declare a variable to store our data
var testData = [];
server.post('/upload/test', function(req, res, next) {
// Extract the 'test' field from the request body
var scheduleItem = req.body.test;
// Add it to our array
testData.push(scheduleItem);
console.log('Stored item:', scheduleItem);
console.log('Total items:', testData.length);
res.send(200, { status: 'ok', message: 'Item stored successfully' });
next();
});
Paso 8: Recuperar datos almacenados
Hemos almacenado datos, pero ¿cómo los recuperamos? Vamos a actualizar nuestro endpoint GET:
server.get('/test', function(req, res, next) {
// Return the entire array of stored items
res.send(testData);
next();
});
Ahora puedes:
- Hacer POST con varios elementos a
/upload/test
- Hacer GET a
/test para recuperar todos los elementos almacenados
Errores comunes y cómo evitarlos
1. Olvidar enviar una respuesta
Si no envías una respuesta, el cliente se quedará esperando indefinidamente. Siempre termina tus manejadores de peticiones con res.send().
2. Ignorar la función next()
En Restify, siempre llama a next() al final de tus manejadores a menos que ya hayas enviado una respuesta. Esto permite que el middleware continúe procesando.
3. No validar la entrada
Siempre valida los datos entrantes antes de procesarlos. En producción, querrás comprobar que los campos requeridos existan y sean del tipo correcto.
¿Qué sigue?
En este tutorial, hemos cubierto:
- Instalar Node.js y configurar tu entorno
- Entender Restify frente a Express
- Construir endpoints GET y POST
- Probar APIs con Advanced REST Client
- Leer payloads JSON y almacenar datos
Pero hay una limitación importante: nuestros datos desaparecen cuando el servidor se reinicia. En el próximo tutorial, integraremos MongoDB para el almacenamiento persistente. MongoDB es una base de datos NoSQL que almacena datos en un formato similar a JSON, lo que la convierte en una opción natural para aplicaciones Node.js.
Después de eso, empezaremos a construir aplicaciones cliente que puedan comunicarse con nuestra API del programador, dando vida a todo el sistema.
Reflexiones finales
Construir una API REST puede parecer abrumador al principio, pero dividirlo en pasos pequeños y manejables lo hace completamente alcanzable. Ahora tienes los conocimientos fundamentales para construir APIs que puedan aceptar datos, procesarlos y servirlos de vuelta a los clientes.
Recuerda: la mejor forma de aprender es haciendo. Modifica el código, experimenta con diferentes endpoints y no tengas miedo de romper cosas: así es como aprendemos.
En la próxima entrega, profundizaremos en MongoDB y aprenderemos a hacer que nuestros datos sean persistentes. ¡Hasta entonces, feliz programación!