REST API Los Secretos De Roy Fielding Y El Arte De Dominar Las APIs
Tópicos Clave para Cubrir en el Post:
1. Introducción
- ¿Qué es REST? Breve definición y contexto histórico.
- La importancia de las APIs en el desarrollo moderno.
2. Roy Fielding y el Origen de REST
- Su papel en la creación de HTTP/1.1 y URI.
- Cómo su tesis doctoral (2000) definió REST.
3. Las 6 Restricciones Arquitectónicas de REST
- Arquitectura Cliente-Servidor (Separación de responsabilidades).
- Stateless (Sin estado) → Cada petición debe ser autónoma.
- Cacheable → Optimización de rendimiento con caché.
- Interfaz Uniforme (Recursos, métodos HTTP estándar, HATEOAS).
- Sistema en Capas (Jerarquía y escalabilidad).
- Código bajo Demanda (Opcional) → Ejecución de lógica en cliente.
4. Buenas Prácticas para APIs RESTful
- Uso correcto de verbos HTTP (GET, POST, PUT, DELETE, PATCH).
- Convenciones de nombrado (URLs limpias y jerárquicas).
- Versionado de APIs (Ej:
/v1/resource
). - Manejo de respuestas (JSON, códigos HTTP adecuados).
- Documentación (OpenAPI/Swagger).
5. Diferencias entre REST, RESTful y No-REST
- ¿Cuándo una API es realmente RESTful?
- Ejemplos de malas implementaciones (RPC disfrazado de REST).
6. Herramientas y Ejemplos Prácticos
- Ejemplo breve de una API RESTful bien diseñada.
- Herramientas para probar APIs (Postman, Insomnia).
7. Conclusión
- Por qué seguir los principios de REST mejora la escalabilidad y mantenibilidad.
- Invitación a profundizar (HATEOAS, autenticación JWT, GraphQL vs REST).
¿Qué es REST? Breve definición y contexto histórico
Definición:
REST (Representational State Transfer) es un estilo arquitectónico para diseñar sistemas distribuidos, especialmente APIs web. Se basa en principios como simplicidad, escalabilidad y statelessness, usando HTTP como protocolo principal.

En esencia, REST define cómo los clientes (navegadores, apps, servicios) deben interactuar con servidores mediante operaciones estándar (GET, POST, PUT, DELETE) sobre recursos identificados por URLs (como /users
o /products
).
Contexto histórico:
- Año 2000: Roy Fielding (uno de los creadores de HTTP/1.1 y URI) publica su tesis doctoral, donde formaliza REST como una evolución de la web.
- Objetivo original: Crear un modelo escalable para la web, evitando la complejidad de alternativas como SOAP (que usaba XML pesado y acoplado).
- Revolución silenciosa: Aunque no se llamaba “REST” en los 90, sitios como Amazon o eBay ya aplicaban sus ideas. Tras la tesis de Fielding, se estandarizó como la forma dominante de diseñar APIs.
“REST no es un protocolo, es una filosofía: recursos, statelessness y uniformidad sobre rituales complejos”.
La importancia de las APIs en el desarrollo moderno
Las APIs REST son el pegamento digital que conecta el mundo:
a) Conectan todo
- Permiten que frontends (React, Android), backends (Node.js, Python) y servicios externos (pagos, IA) se comuniquen con un lenguaje universal (HTTP + JSON).
- Ejemplo: Cuando Uber usa Google Maps, lo hace mediante una API REST.
b) Escalabilidad y agilidad
- Al ser stateless, permiten manejar millones de peticiones con balanceadores de carga (ej: Netflix).
- Facilitan el desarrollo modular: equipos pueden trabajar en paralelo (frontend/backend).
c) Ecosistema y estándares
- Herramientas: Postman, Swagger, OpenAPI.
- Cloud: AWS, Azure y Google Cloud las usan como base.
- Frameworks: Express (JS), Spring Boot (Java), FastAPI (Python) están optimizados para REST.
d) Lo que pierdes sin APIs REST
- Acoplamiento mortal: Sistemas rígidos que no escalan.
- Reinventar la rueda: Protocolos custom propietarios (como en los 90).
“Sin APIs REST, la web sería un archipiélago de islas tecnológicas incomunicadas”.
3. Las 6 Restricciones Arquitectónicas de REST
REST no es solo una forma de construir APIs, sino una filosofía arquitectónica basada en 6 reglas fundamentales. Estas restricciones garantizan que un sistema sea escalable, simple y mantenible. Vamos a desglosarlas una por una:
1. Arquitectura Cliente-Servidor
Separación clara de responsabilidades
- Cliente: Solicita recursos (navegador, app móvil, otro servicio).
- Servidor: Procesa la lógica, gestiona datos y responde.
¿Por qué importa?
- Permite evolucionar frontend y backend de forma independiente.
- Ejemplo: Un mismo backend REST puede servir a una web (React), una app móvil (Android) y un IoT device.
“Divide y vencerás: el cliente maneja la interfaz; el servidor, los datos”.
2. Stateless (Sin estado)
Cada petición es autónoma
- El servidor no guarda contexto entre peticiones.
- Cada request debe incluir toda la información necesaria (headers, tokens, parámetros).
Ventajas:
- Escalabilidad horizontal: Puedes agregar más servidores sin preocuparte por sincronizar estados.
- Simplicidad: No hay sesiones que mantener.
Ejemplo:
- Un token JWT en el header
Authorization
lleva toda la info necesaria para autenticar al usuario.
En REST, el pasado no existe: cada petición es un universo nuevo.
3. Cacheable
Optimización mediante caché
- Las respuestas deben indicar si pueden almacenarse en caché (headers como
Cache-Control
). - Clientes (o CDNs) guardan copias locales de recursos estáticos.
Beneficios:
- Reduce latencia (ej: imágenes, CSS, datos de catálogos).
- Disminuye carga en el servidor.
Ejemplo:
Cache-Control: max-age=3600
→ El cliente cachea la respuesta por 1 hora.
“La caché es el alma gemela del rendimiento: úsala o muere lento”.
4. Interfaz Uniforme
La piedra angular de REST
Cuatro subprincipios clave:
- Recursos identificables: Todo es un recurso con una URL única (
/users/123
). - Representaciones: Los recursos pueden devolverse en JSON, XML, etc.
- Mensajes autodescriptivos: Cada petición/respuesta usa verbos HTTP (GET, POST) y códigos de estado (200, 404).
- HATEOAS (Hypermedia as the Engine of Application State): Las respuestas incluyen enlaces a acciones relacionadas (ej:
"links": [{"rel": "delete", "href": "/users/123"}]
).
Ejemplo práctico:
GET /users/1 HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
{
"id": 1,
"name": "Alice",
"links": [
{ "rel": "self", "href": "/users/1" },
{ "rel": "delete", "href": "/users/1", "method": "DELETE" }
]
}
5. Sistema en Capas
Jerarquía para escalar
- Entre el cliente y el servidor pueden existir capas intermedias:
- Proxies.
- Balanceadores de carga.
- Gateways (como API Managers).
Ventajas:
- Seguridad: Un firewall puede filtrar peticiones antes de llegar al servidor.
- Escalabilidad: Un CDN cachea respuestas cerca del usuario.
Ejemplo:Cliente → Load Balancer → Servidor A → Base de Datos
“REST es como una cebolla: cada capa añade funcionalidad sin romper el núcleo”.
6. Código bajo Demanda (Opcional)
Ejecución remota de lógica
- El servidor puede enviar código ejecutable al cliente (ej: JavaScript, applets).
- Poco usado hoy: Por temas de seguridad y complejidad.
Ejemplo histórico:
- Años 90: Applets de Java en navegadores.
- Hoy: Más común usar WebAssembly o APIs de streaming.
“Un poder con responsabilidad: ¿realmente quieres que tu cliente ejecute código dinámico?”
4. Buenas Prácticas para APIs RESTful
Diseñar una API REST no solo implica seguir las restricciones arquitectónicas, sino también adoptar convenciones claras y estándares ampliamente aceptados. Aquí están las mejores prácticas esenciales:

1. Uso Correcto de Verbos HTTP
Los métodos HTTP definen la acción sobre un recurso. Usarlos correctamente mejora la claridad y consistencia de tu API:
GET
: Solo para leer datos. Nunca debe modificar recursos.
GET /users → Lista todos los usuarios
GET /users/1 → Obtiene el usuario con ID 1
POST
: Para crear recursos nuevos (no idempotente).
POST /users → Crea un nuevo usuario (envía datos en el body)
PUT
: Reemplaza un recurso completo (idempotente).
PUT /users/1 → Actualiza TODOS los campos del usuario 1
PATCH
: Actualiza parcialmente un recurso.
PATCH /users/1 → Modifica solo el campo "email" del usuario 1
DELETE
: Elimina un recurso.
DELETE /users/1 → Borra el usuario con ID 1
Regla de oro: Nunca uses
GET
para acciones que modifican datos (ej:GET /users/1/delete
es un antipatrón).
2. Convenciones de Nombrado (URLs Limpias y Jerárquicas)
Las URLs deben ser intuitivas, consistentes y jerárquicas:
- Usar sustantivos (no verbos):
- ✅
/users
,/products
- ❌
/getUsers
,/createProduct
- ✅
- Plurales:
- ✅
/users/1
(no/user/1
)
- ✅
- Subrecursos para relaciones:
GET /users/1/orders → Órdenes del usuario 1
- Filtros, ordenación y paginación con query params:
GET /users?role=admin&sort=-created_at&page=2
- Evitar verbos en URLs:
❌ /calculateTax
→ ✅ POST /orders/:id/tax
- Ejemplo de URL ideal:
GET /v1/users/1/orders?status=completed&limit=10
3. Versionado de APIs
Las APIs evolucionan, y el versionado previene roturas en clientes existentes:
- En la URL (común y explícito):
/v1/users
/v2/users
- Headers (menos común):
Accept: application/vnd.myapi.v1+json
- Regla clave: Nunca rompas compatibilidad en la misma versión.
4. Manejo de Respuestas (JSON + Códigos HTTP)
Formato JSON
- Estructura clara:
{
"data": { "id": 1, "name": "Alice" },
"meta": { "page": 1, "total": 100 },
"links": { "self": "/users/1", "next": "/users?page=2" }
}
- Evitar respuestas planas:
❌ { "id": 1, "name": "Alice" }
→ ✅ Usa wrappers como data
para extensibilidad.
Códigos HTTP Correctos
200 OK
: Éxito en GET/PUT/PATCH.201 Created
: Recurso creado (POST).204 No Content
: Éxito sin body (DELETE).400 Bad Request
: Error del cliente (validación).401 Unauthorized
: Falta autenticación.403 Forbidden
: Sin permisos.404 Not Found
: Recurso no existe.429 Too Many Requests
: Rate limiting.500 Internal Server Error
: Error genérico del servidor.
Ejemplo de error útil:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "El email es inválido",
"details": { "email": "Debe ser un formato válido" }
}
}
5. Documentación (OpenAPI/Swagger)
Una API sin documentación es como un libro en un idioma desconocido. Herramientas clave:
OpenAPI/Swagger:
- Define endpoints, schemas, ejemplos.
- Genera UI interactiva:
paths:
/users:
get:
summary: "Lista usuarios"
parameters:
- name: "role"
in: "query"
required: false
type: "string"
Herramientas:
- Swagger UI: Interfaz visual.
- Postman: Colecciones para testing.
- Redoc: Alternativa elegante.
Tip: Usa swagger-jsdoc
para generar la spec desde comentarios en el código.
Bonus: Errores Comunes a Evitar
- Mezclar REST con RPC: Ej:
POST /getUsers
. - Ignorar hipermedia (HATEOAS): Pierdes descubribilidad.
- Respuestas inconsistentes: Ej: A veces
data
, a veces no. - No usar HTTPS: Seguridad ante todo.
5. Diferencias entre REST, RESTful y No-REST
El término “REST” se usa con mucha flexibilidad en la industria, lo que lleva a confusión. Vamos a aclarar los conceptos clave y cómo identificar cuándo una API es realmente RESTful o solo una imitación.
1. REST vs. RESTful vs. No-REST
🔹REST (Concepto Teórico)
- Es el estilo arquitectónico definido por Roy Fielding en su tesis.
- Se basa en las 6 restricciones (cliente-servidor, stateless, cacheable, interfaz uniforme, etc.).
- No es un estándar, sino un conjunto de principios.
🔹 RESTful (Implementación Práctica)
- Una API es RESTful cuando cumple la mayoría de los principios REST, especialmente:
- Usa HTTP correctamente (verbos, códigos de estado).
- Tiene URIs jerárquicas y recursos identificables.
- Es stateless.
- Usa HATEOAS (opcional, pero deseable).
- Ejemplos de APIs RESTful bien diseñadas:
- GitHub API (
/repos/{owner}/{repo}
). - Stripe API (
/v1/customers/{id}
).
- GitHub API (
🔹 No-REST (Falsos REST o RPC disfrazado)
- APIs que solo usan HTTP como transporte, pero no siguen los principios REST.
- Ejemplos comunes:
RPC over HTTP:
POST /getUserById
{ "id": 123 }
Acciones en URLs (anti-patrón REST):
GET /deleteUser?id=123
Sin recursos identificables:
POST /executeQuery
2. ¿Cuándo una API es realmente RESTful?
Una API es verdaderamente RESTful si cumple estos criterios:
✅ Usa verbos HTTP según su semántica (GET para leer, POST para crear, etc.).
✅ Los recursos tienen URIs únicas y jerárquicas (/users/1/orders
).
✅ Stateless: Cada petición lleva toda la información necesaria.
✅ Respuestas estructuradas (JSON/XML) con códigos HTTP adecuados.
✅ HATEOAS (Hipermedia): Las respuestas incluyen enlaces a acciones relacionadas (ej: "links": [ { "rel": "delete", "href": "/users/1" } ]
).
{
"id": 1,
"name": "Alice",
"_links": {
"self": { "href": "/users/1" },
"delete": { "href": "/users/1", "method": "DELETE" }
}
}
3. Ejemplos de Malas Implementaciones (RPC Disfrazado de REST)
🚫 Anti-Patrón 1: Verbos en la URL (RPC Style)
GET /getUser?id=1
POST /createUser
DELETE /removeUser?id=1
❌ Problema: Usa HTTP como transporte, pero no sigue la semántica REST.
🚫 Anti-Patrón 2: Ignorar Códigos HTTP
POST /users
{ "error": "Email inválido" }
→ Respuesta: 200 OK
❌ Debe ser: 400 Bad Request
🚫 Anti-Patrón 3: Sessions en el Servidor (Stateful)
GET /cart → Usa cookies/sesiones para identificar al usuario.
❌ REST debe ser stateless: Usar tokens (JWT) en cada petición.
🚫 Anti-Patrón 4: Respuestas Inconsistentes
GET /users/1 → { "name": "Alice" }
GET /users/2 → { "user": { "name": "Bob" }, "status": "active" }
❌ Falta estandarización en la estructura de respuestas.
4. ¿GraphQL, gRPC o SOAP son REST?
- GraphQL: No es REST (usa un solo endpoint y consultas personalizadas).
- gRPC: Tampoco (usa Protocol Buffers y HTTP/2, pero es RPC).
- SOAP: Es un protocolo XML antiguo, mucho más rígido que REST.
6. Herramientas y Ejemplos Prácticos
Para dominar REST no basta con la teoría; hay que verlo en acción. Aquí te muestro:
1️⃣ Un ejemplo real de API RESTful bien diseñada
2️⃣ Las herramientas imprescindibles para probar APIs
1. Ejemplo de API RESTful Bien Diseñada
API de Biblioteca Digital (/v1/books
)
🔷 Estructura de Rutas
Método | Ruta | Acción | Código HTTP |
---|---|---|---|
GET | /v1/books | Listar todos los libros (paginado) | 200 OK |
GET | /v1/books/{id} | Obtener un libro específico | 200 OK |
POST | /v1/books | Crear nuevo libro | 201 Created |
PUT | /v1/books/{id} | Reemplazar libro completo | 200 OK |
PATCH | /v1/books/{id} | Actualizar parcialmente | 200 OK |
DELETE | /v1/books/{id} | Eliminar libro | 204 No Content |
🔷 Ejemplo de Petición/Respuesta
Crear libro (POST)
POST /v1/books HTTP/1.1
Content-Type: application/json
{
"title": "El Principito",
"author": "Antoine de Saint-Exupéry",
"year": 1943
}
Respuesta (201 Created)
### Respuesta (201 Created)
HTTP/1.1 201 Created
Location: /v1/books/100
{
"data": {
"id": 100,
"title": "El Principito",
"author": "Antoine de Saint-Exupéry",
"year": 1943,
"_links": {
"self": { "href": "/v1/books/100", "method": "GET" },
"update": { "href": "/v1/books/100", "method": "PATCH" }
}
}
}
🔷 Características RESTful Cumplidas
✔ URIs jerárquicas y descriptivas (/v1/books/100
)
✔ Verbos HTTP semánticos (POST para crear, GET para leer)
✔ Stateless (autenticación via JWT en headers)
✔ HATEOAS (enlaces a acciones relacionadas en _links
)
✔ Códigos HTTP adecuados (201 para creación, 404 si no existe)
📌 Nota: Observa cómo
Location
header indica dónde encontrar el nuevo recurso.
2. Herramientas para Probar APIs
🔧 Postman (postman.com)
- Para qué sirve:
- Enviar peticiones HTTP con body/headers.
- Organizar colecciones de endpoints.
- Automatizar tests (con scripts en JavaScript).
- Ventaja clave:
- Entorno colaborativo (equipos comparten colecciones).
🔧 Insomnia (insomnia.rest)
- Para qué sirve:
- Pruebas manuales de APIs (similar a Postman).
- Soporte para GraphQL y gRPC.
- Ventaja clave:
- Interfaz más limpia y rápida para desarrollo local.
🔧 Swagger UI / OpenAPI (swagger.io)
- Para qué sirve:
- Documentar APIs interactivamente (muestra endpoints con ejemplos).
- Generar clientes SDK automáticamente.
- Ejemplo de especificación YAML:
paths:
/books:
get:
summary: “List books”
parameters:
– name: “limit”
in: “query”
type: “integer”