En resumen
El enfoque de diseño-primero consiste en escribir la especificación de tu API antes del código de implementación. Esa especificación se convierte en la fuente de verdad para mocks, documentación, pruebas y stubs de cliente. Si eliges una plataforma que conecte todo el flujo, reduces la fricción de mantener código, contrato y documentación sincronizados. En este artículo verás cómo aplicar diseño-primero en la práctica y cómo encaja Apidog como plataforma completa para este flujo.
Introducción
La mayoría de los desarrolladores empiezan creando APIs con un enfoque de código-primero:
- Escribes una ruta.
- Añades anotaciones o decoradores.
- Ejecutas un generador.
- Obtienes documentación.
Funciona bien al principio. El problema aparece cuando la implementación cambia y la documentación no.
Ejemplo típico:
[
"foo",
"bar"
]
La documentación dice que la API devuelve un array de strings, pero la implementación real termina devolviendo esto:
[
{
"value": "foo"
},
{
"value": "bar"
}
]
Ese desajuste rompe integraciones, genera bugs en frontend y hace que los consumidores de la API pierdan confianza en la documentación.
El diseño-primero invierte el flujo:
Especificación OpenAPI
↓
Mocks
↓
Documentación
↓
Pruebas
↓
Implementación
La especificación es la fuente de verdad. El código, los mocks y la documentación se derivan de ella o se validan contra ella.
Esto no es una diferencia teórica. En equipos frontend/backend, el diseño-primero permite trabajar en paralelo desde el primer día: frontend consume mocks, backend implementa contra el contrato y las pruebas validan que ambos coincidan.
La condición clave es que la herramienta haga que escribir la especificación sea rápido. Si definir un endpoint tarda más que implementarlo, el equipo terminará saltándose el diseño. Por eso una buena plataforma de diseño-primero debe hacer que la especificación sea fácil de crear, revisar y usar.
Qué significa diseño-primero en la práctica
Diseño-primero no es una tecnología específica. Es un flujo de trabajo.
1. Antes de escribir código
Primero defines el contrato de la API, normalmente como una especificación OpenAPI.
Debe incluir:
- Rutas y métodos HTTP.
- Parámetros de path, query y headers.
- Esquemas de request body para
POST,PUTyPATCH. - Esquemas de respuesta para códigos como
200,400,401,422y500. - Reglas de autenticación.
- Descripciones de campos.
- Ejemplos de request y response.
Ejemplo simplificado de OpenAPI:
paths:
/users/{id}:
get:
summary: Obtener usuario por ID
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
"200":
description: "Usuario encontrado"
content:
application/json:
schema:
$ref: "#/components/schemas/UserProfile"
"404":
description: "Usuario no encontrado"
components:
schemas:
UserProfile:
type: object
required:
- id
- email
properties:
id:
type: integer
example: 123
email:
type: string
format: email
example: user@example.com
Esta fase es donde se toman decisiones importantes:
- Nombres de campos.
- Estructura de recursos.
- Formato de errores.
- Reglas de paginación.
- Códigos de estado.
- Compatibilidad hacia atrás.
2. Durante el desarrollo
La especificación se publica en un servidor mock.
El frontend puede consumir una URL simulada como si fuera la API real:
const response = await fetch("https://mock.example.com/users/123");
const user = await response.json();
console.log(user.email);
Mientras tanto, backend implementa contra el contrato:
app.get("/users/:id", async (req, res) => {
const user = await userRepository.findById(req.params.id);
if (!user) {
return res.status(404).json({
code: "USER_NOT_FOUND",
message: "User not found"
});
}
return res.json({
id: user.id,
email: user.email
});
});
Frontend y backend ya no se bloquean mutuamente.
3. Después de implementar
Las pruebas validan que la respuesta real coincida con la especificación.
Por ejemplo, una prueba de contrato debería fallar si la API devuelve:
{
"id": 123,
"emailAddress": "user@example.com"
}
cuando la especificación exige:
{
"id": 123,
"email": "user@example.com"
}
El objetivo no es solo comprobar que la API responde, sino que responde con el contrato correcto.
4. Cuando cambian los requisitos
El cambio empieza en la especificación:
- Se actualiza el contrato.
- El equipo revisa el cambio.
- Los mocks se actualizan.
- La documentación refleja la nueva versión.
- Backend ajusta la implementación.
- Las pruebas detectan cualquier desviación.
Así evitas que la implementación se convierta en una fuente de verdad oculta.
Qué necesita una plataforma de diseño-primero
No todas las herramientas de API soportan bien este flujo. Una plataforma útil para diseño-primero debe cubrir estas piezas.
Editor visual de API
Editar YAML manualmente puede ser lento y propenso a errores de indentación.
Un buen editor visual debe permitir definir:
- Método HTTP.
- Ruta.
- Parámetros.
- Headers.
- Request body.
- Responses.
- Schemas reutilizables.
- Ejemplos.
- Reglas de validación.
También debe generar OpenAPI válido y permitir reutilizar componentes.
Ejemplo de componente reutilizable:
components:
schemas:
ErrorResponse:
type: object
required:
- code
- message
properties:
code:
type: string
message:
type: string
Luego puedes usarlo en varios endpoints:
responses:
"400":
description: Solicitud inválida
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
Validación de OpenAPI
La especificación debe validarse mientras la editas.
La herramienta debería detectar errores como:
- Campos requeridos faltantes.
-
$refrotos. - Tipos inválidos.
- Responses sin descripción.
- Schemas mal estructurados.
Cuanto antes aparezca el error, más barato es corregirlo.
Generación automática de mocks
El flujo ideal es:
Definir endpoint → Guardar especificación → Obtener mock funcional
Sin configuración manual adicional.
El mock debe respetar:
- Tipos de datos.
- Formatos (
email,date-time, etc.). - Enumeraciones.
- Rangos
minimum/maximum. - Objetos anidados.
- Arrays.
- Referencias
$ref.
Vista previa de documentación
La especificación debe poder renderizarse como documentación legible.
Esto permite revisar el contrato con:
- Frontend.
- Backend.
- QA.
- Product managers.
- Stakeholders no técnicos.
Una buena vista previa debe mostrar:
- Descripciones.
- Parámetros.
- Ejemplos.
- Schemas.
- Códigos de estado.
- Reglas de autenticación.
Flujo de revisión en equipo
Los cambios en la especificación deben tratarse como cambios en código.
Un flujo práctico sería:
- Alguien propone un cambio.
- El equipo comenta.
- Se ajusta la especificación.
- Se aprueba.
- Se implementa.
La plataforma debe soportar comentarios, historial y trazabilidad.
Exportación a OpenAPI estándar
La especificación tiene que ser portable.
Debes poder exportarla como OpenAPI 3.x y usarla con otras herramientas:
- Generadores de código.
- Gateways API.
- Frameworks de prueba.
- Validadores de contrato.
- Herramientas de documentación.
Apidog como plataforma de diseño-primero
Apidog está organizado alrededor de la especificación como artefacto principal. La pestaña de diseño, el servidor mock, el ejecutor de pruebas y la documentación se conectan a la misma definición de API.
Editor visual de OpenAPI
La interfaz de diseño de Apidog usa edición basada en formularios.
Para cada endpoint puedes definir:
- Ruta.
- Método.
- Parámetros.
- Request body.
- Responses.
- Schemas.
- Descripciones.
- Reglas de validación.
- Datos de mock.
No necesitas escribir YAML si no quieres. También puedes abrir una vista raw para editar YAML o JSON directamente. Los cambios entre la vista visual y la vista raw se sincronizan.
Los componentes de esquema son reutilizables. Puedes definir un esquema UserProfile una vez y referenciarlo desde múltiples endpoints con $ref.
Ejemplo:
components:
schemas:
UserProfile:
type: object
properties:
id:
type: integer
email:
type: string
format: email
displayName:
type: string
Luego lo reutilizas:
schema:
$ref: "#/components/schemas/UserProfile"
Si cambias UserProfile, todos los endpoints que lo referencian reflejan ese cambio.
Vista previa de documentación en tiempo real
Mientras diseñas un endpoint, la documentación se actualiza en tiempo real.
Esto te permite comprobar si el contrato es entendible antes de implementar.
Revisa especialmente:
- Si los nombres de campos son claros.
- Si las descripciones explican el comportamiento.
- Si los ejemplos son realistas.
- Si los errores están documentados.
- Si los códigos de estado son correctos.
Puedes compartir un enlace de documentación con producto o frontend durante la fase de diseño. No necesitan instalar nada para revisarlo.
Smart Mock: de especificación a mock funcional
Cuando guardas un endpoint nuevo en Apidog, el servidor mock queda disponible de inmediato. La URL del mock aparece en la interfaz.
El mock genera respuestas basadas en los schemas:
- Los strings con
format: emaildevuelven emails válidos. - Los enteros con
minimumymaximumdevuelven valores dentro del rango. - Los enums devuelven valores permitidos.
- Los objetos y arrays anidados siguen la estructura definida.
- Los componentes
$refse resuelven correctamente.
Ejemplo de schema:
UserProfile:
type: object
properties:
id:
type: integer
minimum: 1
maximum: 9999
email:
type: string
format: email
role:
type: string
enum:
- admin
- member
- viewer
El mock puede devolver algo como:
{
"id": 42,
"email": "user@example.com",
"role": "member"
}
También puedes configurar reglas personalizadas. Por ejemplo:
- Devolver
404cuando el parámetroidsea0. - Devolver una respuesta específica para
?status=inactive. - Simular errores de validación para pruebas de frontend.
Revisión en equipo y seguimiento de cambios
En Apidog, los cambios en la especificación son visibles para los miembros del workspace.
El equipo puede:
- Comentar endpoints.
- Comentar campos específicos.
- Revisar cambios.
- Ver quién modificó qué y cuándo.
Para diseño-primero, esto evita procesos paralelos. La revisión del contrato ocurre en la misma herramienta donde se diseña, documenta, prueba y simula la API.
Diseño-primero vs. código-primero: compensaciones reales
Diseño-primero no siempre es la mejor opción. Depende del tipo de proyecto y del equipo.
Ventajas del diseño-primero
- Frontend y backend pueden trabajar en paralelo.
- La documentación es precisa porque nace del contrato.
- Los problemas de integración aparecen antes.
- El contrato de API es explícito y verificable.
- Los cambios pasan por revisión.
- Los mocks están disponibles desde el inicio.
Desventajas del diseño-primero
- Requiere tiempo inicial para definir la especificación.
- La herramienta de especificación tiene curva de aprendizaje.
- Exige disciplina para mantener implementación y contrato sincronizados.
- Puede llevar a especificar demasiado pronto si el dominio aún no está claro.
Ventajas del código-primero
- Más rápido para prototipos pequeños.
- Menos proceso para desarrolladores individuales.
- No necesitas aprender una herramienta adicional.
- Útil cuando la API cambia constantemente durante exploración.
Desventajas del código-primero
- La documentación es secundaria y puede quedar obsoleta.
- Frontend suele esperar a backend para integrar.
- El contrato es implícito.
- Los breaking changes son más difíciles de detectar.
- Refactorizar la API requiere actualizar documentación manualmente.
Para equipos con más de un ingeniero trabajando en una API, diseño-primero suele dar mejores resultados. La inversión inicial se compensa cuando hay coordinación real entre frontend, backend, QA y producto.
Herramientas que soportan flujos de diseño-primero
Apidog
Apidog ofrece una plataforma completa para diseño-primero: editor visual, mocks instantáneos, documentación, pruebas y revisión en equipo en una sola herramienta. El nivel gratuito cubre el conjunto completo de funciones. Su generación de mocks es uno de sus diferenciadores principales.
Stoplight Studio
Stoplight Studio es un editor OpenAPI sólido con linting Spectral para aplicar reglas de estilo. No incluye servidor mock ni ejecutor de pruebas incorporados. Es útil para organizaciones que necesitan gobernanza de APIs, aunque puede resultar caro para equipos pequeños.
SwaggerHub
SwaggerHub es una plataforma madura para edición y colaboración sobre OpenAPI. Se usa mucho en empresas. Su capacidad de mock es limitada y no incluye pruebas. Encaja bien en organizaciones centradas en especificaciones dentro del ecosistema Swagger.
Postman con API Builder
Postman incluye una pestaña para diseño de APIs que genera especificaciones OpenAPI. Sin embargo, los flujos de diseño y colecciones pueden sentirse desconectados. El servidor mock requiere configuración manual a partir de colecciones, en lugar de generarse automáticamente desde la especificación. Funciona para equipos código-primero que quieren añadir documentación.
Insomnia con modo documento
Insomnia soporta edición de especificaciones OpenAPI y proporciona mock básico. Es menos completo que herramientas dedicadas a diseño-primero, pero puede servir para desarrolladores individuales que buscan una opción ligera.
Cómo configurar un flujo diseño-primero en Apidog
Paso 1: Empieza con la especificación, no con una colección
Crea un proyecto nuevo y abre la pestaña de diseño.
Antes de enviar una sola request, define como mínimo:
- Ruta.
- Método.
- Parámetros principales.
- Response esperado.
- Schema de error.
Ejemplo de checklist para un endpoint:
[ ] Método HTTP definido
[ ] Ruta definida
[ ] Parámetros documentados
[ ] Response 200 definido
[ ] Response de error definido
[ ] Schema reutilizable si aplica
[ ] Ejemplo de respuesta incluido
Paso 2: Define componentes compartidos primero
Antes de añadir muchos endpoints, define los schemas reutilizables.
Por ejemplo:
ErrorResponsePaginationMetaUserProfileAddressCreatedResourceResponse
Ejemplo:
components:
schemas:
PaginationMeta:
type: object
properties:
page:
type: integer
pageSize:
type: integer
total:
type: integer
Esto evita que cada endpoint invente su propio formato de paginación.
Paso 3: Obtén la URL del mock temprano
Cuando guardes el endpoint, copia la URL del mock y compártela con frontend.
Frontend puede empezar a integrar con algo como:
const API_BASE_URL = "https://mock.example.com";
export async function getUser(id) {
const response = await fetch(`${API_BASE_URL}/users/${id}`);
if (!response.ok) {
throw new Error("Failed to fetch user");
}
return response.json();
}
Cuando backend esté listo, solo se cambia el API_BASE_URL.
Paso 4: Revisa la documentación antes de implementar
Abre la vista previa de documentación y valida:
- ¿La descripción del endpoint explica qué hace?
- ¿Los parámetros tienen significado claro?
- ¿Los ejemplos ayudan a consumir la API?
- ¿Los errores esperados están definidos?
- ¿El schema refleja lo que frontend necesita?
Si algo no se entiende en la documentación, tampoco será claro para quien consuma la API.
Paso 5: Bloquea la especificación para el sprint
Cuando el diseño esté revisado, trata la especificación como bloqueada para ese sprint.
Si backend descubre que necesita cambiar el contrato, el flujo debería ser:
Proponer cambio → Revisar con frontend/producto → Actualizar especificación → Implementar
No cambies silenciosamente la respuesta real.
Paso 6: Ejecuta validación de schema en CI
Configura pruebas para comprobar que la implementación real coincide con la especificación.
El objetivo es detectar automáticamente cambios como:
- Campos faltantes.
- Tipos incorrectos.
- Códigos de estado no documentados.
- Estructuras de error inconsistentes.
- Responses incompatibles con el schema.
Esta es la barrera que mantiene sincronizados contrato e implementación.
Preguntas frecuentes
¿El diseño-primero es solo para APIs REST?
No. El principio aplica a cualquier protocolo donde puedas definir un contrato:
- REST con OpenAPI.
- GraphQL con schema-first.
- gRPC con protobuf.
- Sistemas event-driven con AsyncAPI.
Apidog soporta diseño REST y GraphQL. Para gRPC, los archivos proto cumplen el mismo rol de contrato primero.
¿Tenemos que definir todos los endpoints antes de empezar?
No. Puedes adoptar diseño-primero por funcionalidad.
Por ejemplo, si vas a construir una nueva pantalla de perfil de usuario, define primero los endpoints necesarios para esa pantalla, aunque otras partes del sistema sigan siendo código-primero.
La adopción incremental funciona bien.
¿Cómo encaja diseño-primero con sprints ágiles?
Al inicio del sprint, el equipo define el contrato de API para las funcionalidades planificadas.
Luego:
- Frontend trabaja contra mocks.
- Backend implementa contra la especificación.
- QA revisa escenarios desde el contrato.
- La documentación queda lista como parte del flujo.
La revisión de especificación pasa a formar parte de la planificación técnica del sprint.
¿Qué pasa si la implementación necesita diferir de la especificación original?
Puede pasar.
El proceso correcto es:
- Actualizar la especificación.
- Revisar el cambio con los interesados.
- Actualizar mocks y documentación.
- Modificar la implementación.
- Ejecutar pruebas de contrato.
Así la especificación sigue siendo la fuente de verdad.
¿Podemos generar stubs de servidor desde la exportación OpenAPI de Apidog?
Sí. Puedes exportar la especificación de Apidog como OpenAPI 3.x y usar generadores estándar para crear stubs de servidor.
Por ejemplo, con openapi-generator puedes generar código base para distintos lenguajes y frameworks.
Flujo típico:
Exportar OpenAPI → Ejecutar generador → Implementar handlers → Validar contra contrato
¿Cómo manejamos el versionado de la especificación?
Apidog mantiene historial de cambios dentro del proyecto.
Para versiones mayores que conviven en paralelo, como v1 y v2, puedes usar proyectos o ramas separadas.
Ejemplo:
api-users-v1
api-users-v2
O bien:
main
v2-design
según el flujo de trabajo del equipo.
Conclusión
El diseño-primero exige una pequeña inversión inicial: definir el contrato antes de implementar. A cambio, reduce costos de integración, mejora la colaboración entre frontend y backend y mantiene la documentación alineada con la API real.
La herramienta importa. Si escribir la especificación es lento o incómodo, el equipo la evitará. Un editor visual, mocks instantáneos, documentación en tiempo real y pruebas de contrato hacen que diseño-primero sea práctico.
Apidog combina esas piezas en un flujo único, lo que ayuda a convertir la especificación en el centro del desarrollo de APIs, no en una tarea secundaria al final del sprint.
Top comments (0)