Principios de Diseño de API
Los buenos principios de diseño de API garantizan que las interfaces sean comprensibles, mantenibles y escalables, tanto para desarrolladores como para clientes automatizados.
Descripción compacta
Los principios de diseño de API son directrices que sigues al planificar e implementar interfaces para construir APIs consistentes, predecibles y duraderas. El centro está en la orientación a recursos, donde modelasprocesos empresariales como usuarios, pedidos o productos como URLs e interactúas con ellos usando métodos HTTP. Una buena API es sin estado, idempotente, versionada y entrega respuestas de error inequívocas. Utiliza paginación para grandes volúmenes de datos, caché para rendimiento y convenciones de nomenclatura claras para legibilidad. La seguridad, documentación y extensibilidad se consideran desde el inicio, no se añaden después.
Actualmente trabajo muchísimo con APIs, por ejemplo para bots de IA, interfaces de chat impulsadas por IA o para descargar y procesar automáticamente documentos como patentes. Te enamorarás de un buen diseño de API y muy pronto odiarás los diseños deficientes.
Quizás te preguntes por qué deberías programar una interfaz API. Déjame responderte brevemente. “¡Para tus propios programas!”
Sí, programo muchas herramientas en Python y a veces las necesito en otra herramienta. ¿Por qué integrar siempre y copiar código cuando puedo acceder a ello simplemente a través de una interfaz? De esta forma solo necesito corregir un bug en un lugar.
Ejemplo: Mi framework FastAPI necesita un limpiador de texto y un script de documentos. Fue mucho más simple crear una API, porque poco después descubrí errores en el limpiador que no tuve que resolver dos veces.
Para diseñar APIs decentes, existen algunos buenos principios y reglas:
Componentes importantes del diseño de API
Orientación a recursos
La orientación a recursos significa que construyes tu API alrededor de objetos empresariales. En lugar de exponer funciones o acciones, defines recursos y utilizas métodos HTTP para leerlos, crearlos, modificarlos o eliminarlos. Un artículo se direcciona por ejemplo a través de /articles/123, no a través de /getArticle?id=123. Esto hace que la API sea intuitiva y fácil de recordar.
Convenciones de nomenclatura consistentes
Utiliza consistentemente letras minúsculas, guiones o guiones bajos y formas plurales. URLs como /order-items, /customers e /invoices/42/payments son fáciles de leer y siguen una jerarquía clara. Evita camelCase, abreviaciones y variaciones ortográficas para conceptos similares.
Ausencia de estado
Cada solicitud a la API debe contener toda la información que el servidor necesita para procesarla. El servidor no almacena estado de sesión entre solicitudes. La información de autenticación se transmite en cada request, por ejemplo en el encabezado Authorization. Esto hace que la API sea escalable y resistente a fallos.
Expresar verbos a través de métodos HTTP
Utiliza GET, POST, PUT, PATCH y DELETE correctamente. GET es para acceso de lectura, POST para crear nuevos recursos, PUT para reemplazos completos, PATCH para actualizaciones parciales y DELETE para eliminación. Evita acciones en URLs como /articles/123/delete.
Idempotencia
Las operaciones idempotentes proporcionan el mismo resultado cuando se invocan repetidamente. GET, PUT y DELETE son idempotentes, POST normalmente no lo es. Para operaciones no idempotentes puedes usar claves de idempotencia para evitar doble carga accidental. Esto es especialmente importante para pagos, pedidos y reservas.
Versionado
Las APIs cambian con el tiempo. Un versionado claro, por ejemplo a través de la ruta /v1/customers o a través de encabezados, permite que los clientes sigan utilizando la API mientras introduces nuevas funcionalidades. Evita cambios incompatibles en versiones existentes.
Gestión clara de errores
Las respuestas de error deben contener códigos de estado HTTP consistentes y mensajes de error significativos. Por ejemplo, utiliza 400 Bad Request para entradas inválidas, 404 Not Found para recursos desconocidos y 409 Conflict para conflictos. Los objetos de error estructurados según RFC 7807 ayudan a los clientes a procesar errores automáticamente.
Paginación
No entregues grandes conjuntos de resultados de una sola vez. Utiliza paginación, ya sea a través de números de página, offset y limit o basada en cursor. La paginación basada en cursor es más adecuada para conjuntos de datos muy grandes y datos en tiempo real, porque no tiene problemas con resultados desplazados.
HATEOAS
HATEOAS significa Hipermedia como motor del estado de la aplicación. La respuesta de una API contiene entonces enlaces a recursos relacionados y acciones posibles. De esta forma, un cliente puede explorar la API en gran medida de forma dinámica sin necesidad de conocer URLs codificadas.
Caché y rendimiento
Utiliza encabezados HTTP como ETag, Last-Modified y Cache-Control para reducir solicitudes repetidas. El caché reduce la carga del servidor y mejora los tiempos de respuesta. Para datos estáticos o que cambian raramente, tiene sentido un caché más largo, para datos en tiempo real preferiblemente uno corto o ninguno.
Seguridad desde el inicio
Utiliza HTTPS, autentica y autoriza accesos, valida entradas e implementa limitación de velocidad. Evita datos sensibles en URLs, registra eventos relevantes para la seguridad y presta atención a las recomendaciones de OWASP para APIs.
Documentación y contratos
Una API es solo tan buena como su documentación. OpenAPI Specification te permite describir la API de forma legible por máquina, incluir ejemplos y apoyar pruebas y generación de código.
Ejemplo práctico
Imagina una tienda en línea que gestiona artículos, clientes y pedidos. La API podría ofrecer los siguientes recursos:
GET /api/v1/products Lista de todos los productos con paginación
GET /api/v1/products/42 Vista de detalle de un producto
POST /api/v1/orders Crear nuevo pedido
PUT /api/v1/orders/123 Reemplazar pedido completamente
PATCH /api/v1/orders/123/status Actualizar estado del pedido
DELETE /api/v1/orders/123 Eliminar pedido
GET /api/v1/orders/123/items Elementos de un pedido
Una solicitud POST para un nuevo pedido podría verse así:
POST /api/v1/orders
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Idempotency-Key: 9f8e7d6c-5b4a-3210-9f8e-7d6c5b4a3210
{
"customerId": 123,
"items": [
{ "productId": 42, "quantity": 2 },
{ "productId": 7, "quantity": 1 }
],
"shippingAddress": {
"street": "Musterstraße 12",
"city": "Berlin",
"zip": "10115"
}
}
La respuesta en caso de creación exitosa:
HTTP/1.1 201 Created
Location: /api/v1/orders/98765
Content-Type: application/json
{
"orderId": 98765,
"status": "created",
"total": 79.97,
"links": {
"self": "/api/v1/orders/98765",
"items": "/api/v1/orders/98765/items",
"cancel": "/api/v1/orders/98765/cancel"
}
}
FAQ: Principios de Diseño de API
1. ¿Qué significa diseño de API orientado a recursos?
2. ¿Por qué una API debe ser sin estado?
3. ¿Qué es idempotencia y por qué es importante?
4. ¿Qué métodos HTTP se deben usar en una API REST?
5. ¿Cómo se versionan correctamente las APIs?
6. ¿Qué es HATEOAS?
7. ¿Por qué es importante la paginación?
8. ¿Qué son Problem Details?
9. ¿Cuál es la diferencia entre PUT y PATCH?
10. ¿Cómo deben estructurarse las URLs en una API REST?
11. ¿Qué es una Idempotency Key?
12. ¿Por qué HTTPS es obligatorio para las APIs?
13. ¿Qué es Content Negotiation?
14. ¿Qué es API Rate Limiting?
15. ¿Por qué es importante la documentación de API?
Continuando con la ruta de aprendizaje de APIs
El siguiente artículo en la ruta de aprendizaje de APIs aborda principios de diseño API-First — por qué la especificación de la API debe preceder a la implementación y cómo funciona el desarrollo impulsado por API.
Fuentes
- https://www.rfc-editor.org/rfc/rfc9110
- https://www.rfc-editor.org/rfc/rfc7807
- https://swagger.io/specification/
- https://developer.mozilla.org/docs/Web/API
Lecturas recomendadas sobre desarrollo de APIs
Si quieres profundizar en diseño de APIs, REST y arquitectura de software, te recomendamos los siguientes libros:
Keine Bücher für Kategorie "api-development" gefunden.



