09 - La Forja: el contrato de la API
La presentación es la consola: un solo usuario, en el mismo ordenador, tecleando. El paso que viene la pondrá en Spring Boot; pero primero hay que diseñar el contrato: qué recursos existen, qué endpoints los atienden y qué código de estado devuelve cada caso. El paso es papel y lápiz.
1. Qué se pide
- Diseñar el contrato completo de la API de La Forja y documentarlo en dos tablas tuyas:
- la tabla de endpoints: recurso, ruta, método, acción que realiza y respuesta esperada (con su código de estado de éxito);
- la tabla de respuestas a los fallos: cada situación que puede salir mal de la API (las excepciones del paso 05, datos inválidos, errores no previstos…) y su código.
- El dominio de La Forja se expresa en sustantivos en plural; la acción la determina el método HTTP, no la URL.
- Las mismas acciones que ya tiene la app (listar y ficha, registrar, retirar, filtrar la forja, equipar, informes) tienen su hueco en el contrato — pero tú decides su forma.
- El contrato no se implementa aún: solo se diseña, como el pseudocódigo en el paso 01. Se implementará en el paso 10 tal y como quede escrito aquí.
2. Con qué
- Todo lo del tema: anatomía de una URL, diseño de recursos y endpoints, métodos HTTP y su significado, JSON y, sobre todo, los códigos de estado: cómo se elige el que corresponde a cada situación.
- Los datos que viajan en el cuerpo lo definen los DTO records del paso 08: el diseño elige cuáles son entrada y cuáles salida. Los cuerpos en JSON se serializan del record — el formato lo pone la librería, no tú: decide qué campos va a llevar cada uno.
- Ejemplo del estilo de cuerpo que viaja (los campos los dictan tus DTO):
{ "nombre": "Aria", "clase": "MAGO", "nivel": 2 }
{ "id": 1, "nombre": "Aria", "clase": "MAGO", "nivel": 2, "poder": 15 }
{ "message": "No existe el héroe con id 99" }
- Ojo con la escritura para quien va a consumir la API: los clientes razonan con el contrato, no con tu código. Nombres, rutas y cuerpos tienen que explicarse solos.
3. Decisiones tuyas
- ¿Qué recursos has decidido y por qué? El plural y la ruta base (¿incluye la versión de la API?) son parte del contrato.
- ¿Qué método HTTP atiende cada acción y qué código promete en éxito? Justifica el método con su significado, no con la costumbre.
- ¿Cómo identifica al héroe la ruta: path parameter, query parameter o en el cuerpo? Y ¿cómo se expresa la relación entre héroe e ítem equipado (¿se anida la ruta o no)?
- El filtro por rareza de la forja: ¿su propio endpoint o un parámetro? ¿Por qué?
- ¿Qué código recibe cada fallo y qué cuerpo? Un héroe que no existe y un ítem que no existen: ¿misma respuesta o distinta?
- ¿Se devuelve la ficha creada al registrar? ¿Y en cada fallo, un cuerpo de error con mensaje legible?
4. Comprobación
- El contrato cubre todas las acciones actuales de la app, sin endpoints para cosas que no existen y sin acciones sin hueco.
- Los 'status' de éxito de cada fila distinguen creación de consulta de acción sin cuerpo de respuesta; los de fallo distinguen esfuerzo del cliente de fallo del servidor.
- Las rutas del contrato se pueden probar a mano con los ejemplos JSON sin ayuda adicional: nombres, métodos y cuerpos se explican solos.
- Cada fila de la tabla de fallos remite sin ambigüedad a una situación concreta de negocio del paso 05.
- El de al lado puede diseñar directamente desde tu tabla el controlador del paso 10 sin preguntarte nada: esa es la prueba del contrato.
5. Pendientes
- La implementación del contrato, en Spring Boot (10): DispatcherServlet, controladores anotados y manejo global de excepciones.