Construir software es como cultivar un jardín: algunos florecen y se vuelven obras maestras, mientras que otros marchitan con el tiempo. La diferencia radica en los fundamentos arquitectónicos que elegimos desde el principio.
Building software is like cultivating a garden: some bloom and become masterpieces, while others wither over time. The difference lies in the architectural foundations we choose from the beginning.
Hoy quiero hablarte sobre REST, el estilo arquitectónico que revolucionó la forma en que construimos aplicaciones web modernas. Si alguna vez te has preguntado cómo funcionan las APIs que usas todos los días, este artículo es para ti.
Today I want to talk to you about REST, the architectural style that revolutionized the way we build modern web applications. If you've ever wondered how the APIs you use every day work, this article is for you.
REST (Representational State Transfer) es un estilo de arquitectura para sistemas distribuidos, definido por Roy Fielding en su tesis doctoral del año 2000. Fielding, uno de los creadores del protocolo HTTP, estableció los principios que hoy sustentan la mayor parte de la web moderna.
REST (Representational State Transfer) is an architectural style for distributed systems, defined by Roy Fielding in his doctoral dissertation in 2000. Fielding, one of the creators of the HTTP protocol, established the principles that today underpin most of the modern web.
Empresas como Twitter, Spotify, Netflix y prácticamente cualquier servicio digital moderno exponen sus funcionalidades a través de APIs REST. Es el estándar de facto para la comunicación entre sistemas.
Companies like Twitter, Spotify, Netflix, and virtually any modern digital service expose their functionalities through REST APIs. It is the de facto standard for communication between systems.
REST aprovecha los verbos HTTP para definir las operaciones sobre los recursos. Este mapeo intuitivo es parte de su elegancia:
REST leverages HTTP verbs to define operations on resources. This intuitive mapping is part of its elegance:
Leer / ConsultarRead / Query
Crear nuevoCreate New
Actualizar completoFull Update
EliminarDelete
Una de las restricciones fundamentales de REST es que cada petición debe contener toda la información necesaria para ser procesada. El servidor no guarda estado del cliente entre peticiones.
One of the fundamental constraints of REST is that each request must contain all the information necessary to be processed. The server does not store client state between requests.
¿Cómo se identifica entonces al usuario? Mediante tokens de autenticación (como JWT) que viajan en cada request. Esto permite que nuestros servidores sean fácilmente escalables, ya que cualquier instancia puede atender cualquier petición.
How is the user identified then? Through authentication tokens (like JWT) that travel with each request. This allows our servers to be easily scalable, since any instance can handle any request.
Aunque REST puede trabajar con XML, texto plano o incluso HTML, JSON (JavaScript Object Notation) se ha convertido en el formato preferido por su simplicidad y legibilidad:
Although REST can work with XML, plain text, or even HTML, JSON (JavaScript Object Notation) has become the preferred format due to its simplicity and readability:
{
"nombre": "Oscar",
"edad": 25,
"profesion": "Desarrollador",
"skills": ["JavaScript", "Node.js", "React"],
"contacto": {
"email": "oscar@example.com",
"github": "OscarCode9"
}
}
Veamos cómo implementar una API REST completa siguiendo las mejores prácticas. Este ejemplo incluye todas las operaciones CRUD sobre un recurso de usuarios:
Let's see how to implement a complete REST API following best practices. This example includes all CRUD operations on a users resource:
const express = require('express');
const app = express();
app.use(express.json());
// Simulamos una base de datos en memoria
let usuarios = [
{ id: 1, nombre: 'Oscar', email: 'oscar@example.com' }
];
// GET /api/usuarios - Listar todos
app.get('/api/usuarios', (req, res) => {
res.json({ success: true, data: usuarios });
});
// GET /api/usuarios/:id - Obtener uno
app.get('/api/usuarios/:id', (req, res) => {
const usuario = usuarios.find(u => u.id === parseInt(req.params.id));
if (!usuario) {
return res.status(404).json({
success: false,
error: 'Usuario no encontrado'
});
}
res.json({ success: true, data: usuario });
});
// POST /api/usuarios - Crear nuevo
app.post('/api/usuarios', (req, res) => {
const { nombre, email } = req.body;
// Validación básica
if (!nombre || !email) {
return res.status(400).json({
success: false,
error: 'Nombre y email son requeridos'
});
}
const usuario = {
id: usuarios.length + 1,
nombre,
email,
createdAt: new Date().toISOString()
};
usuarios.push(usuario);
res.status(201).json({ success: true, data: usuario });
});
// PUT /api/usuarios/:id - Actualizar
app.put('/api/usuarios/:id', (req, res) => {
const usuario = usuarios.find(u => u.id === parseInt(req.params.id));
if (!usuario) {
return res.status(404).json({
success: false,
error: 'Usuario no encontrado'
});
}
usuario.nombre = req.body.nombre || usuario.nombre;
usuario.email = req.body.email || usuario.email;
usuario.updatedAt = new Date().toISOString();
res.json({ success: true, data: usuario });
});
// DELETE /api/usuarios/:id - Eliminar
app.delete('/api/usuarios/:id', (req, res) => {
const index = usuarios.findIndex(u => u.id === parseInt(req.params.id));
if (index === -1) {
return res.status(404).json({
success: false,
error: 'Usuario no encontrado'
});
}
usuarios.splice(index, 1);
res.status(204).send();
});
app.listen(3000, () => {
console.log('🚀 API REST corriendo en http://localhost:3000');
});
Aunque han surgido alternativas como GraphQL y gRPC, REST sigue siendo la opción más popular por varias razones:
Although alternatives like GraphQL and gRPC have emerged, REST remains the most popular choice for several reasons:
Dominar REST es fundamental para cualquier desarrollador. Es la base sobre la cual se construye la web moderna y seguirá siendo relevante por muchos años más.
Mastering REST is fundamental for any developer. It is the foundation upon which the modern web is built and will remain relevant for many years to come.