Módulo 3 · Diseño de APIs

Lección 15 — Validación y contratos con OpenAPI

Validación de entrada y un contrato que el cliente puede leer sin preguntarte.

Publicada
En esta lección
  1. Ejercicio 1 — El serializer con límites
  2. Ejercicio 2 — Las capas en acción
  3. Ejercicio 3 — El contrato vivo
  4. Ejercicio 4 — El contrato como test
  5. Entrega

DRF + pip install drf-spectacular. No mires solutions.md hasta entregar.

Ejercicio 1 — El serializer con límites

  1. Escribe ReserveInputSerializer completo (event UUID, seats 1-8 con sector/row/number, promo_code opcional write_only).
  2. Prueba desde shell con serializer.is_valid(): 0 asientos, 9 asientos, seats mal formado, uuid inexistente. ¿Mensajes útiles en cada caso?
  3. Añade validate_event que comprueba existencia (forma/referencia) y justifica por qué el "evento pasado" (negocio) va en el servicio y no aquí.

Ejercicio 2 — Las capas en acción

  1. Envía un POST con JSON malformado, otro con tipos mal y otro con negocio imposible (asiento ocupado). Documenta qué capa responde cada uno y con qué status.
  2. Mueve (hipotéticamente) la comprobación "asiento libre" al serializer: ¿qué raza reintroduce? (conéctalo con la 10).

Ejercicio 3 — El contrato vivo

  1. Instala drf-spectacular, publica /api/schema/ y /api/docs/. Descarga el YAML y revisa qué adivinó mal (responses sin documentar, request bodies ambiguos).
  2. Anota @extend_schema en tus 3 endpoints más complejos (reservar, webhook, redeem tarjeta) con request/responses/errores documentados.
  3. Añade al pipeline (o script local) spectacular --fail-on-warn y hazlo pasar.

Ejercicio 4 — El contrato como test

  1. Escribe un test que: llame a tu endpoint de reserva, tome la respuesta JSON y valide que su status/estructura coincide con lo declarado en el schema (mínimo: status code y claves del body).
  2. Extrae los examples del schema y valida una respuesta real contra el example (a mano o con jsonschema). ¿Cuántas veces has visto docs que mienten? Este test es la vacuna.

Entrega

Pega serializer, schema recortado y resultados del CI. Después: Lección 16 — gRPC, GraphQL, WebSockets/SSE.