Saltar al contenido principal

Documentación

🎯 Objetivo

Regla

9.1: Se debe proporcionar documentación completa, precisa, actualizada y fácil de entender para todas las APIs REST. 9.2: La documentación es un componente esencial de la API y debe tratarse con la misma rigurosidad que el código.

📖 Concepto y Definición

Regla

9.3: La documentación de la API debe servir como la "fuente de verdad" para los consumidores, describiendo cómo usar la API correctamente. 9.4: Es obligatorio utilizar el estándar OpenAPI Specification (OAS), preferiblemente la versión 3.x, para describir formalmente la API. 9.5: La documentación debe incluir, como mínimo:

  • Información General: Propósito de la API, audiencia, información de contacto, URL base, esquema de autenticación/autorización requerido.
  • Descripción de Endpoints: Para cada endpoint (ruta + método HTTP):
    • Descripción clara de su propósito.
    • Parámetros de ruta, consulta y encabezado (nombre, tipo, si es requerido, descripción).
    • Descripción del cuerpo de la solicitud esperado (schema, ejemplos).
    • Posibles respuestas (códigos de estado HTTP, descripción, schema del cuerpo de la respuesta si aplica, ejemplos).
    • Permisos requeridos (si aplica).
    • Indicación de idempotencia (si aplica).
  • Modelos/Schemas: Definición de las estructuras de datos JSON utilizadas en solicitudes y respuestas.
  • Versionado: Información sobre la estrategia de versionado y las versiones disponibles.
  • Manejo de Errores: Descripción del formato estándar de error (ver Sección 11).
  • Tutoriales/Guías (Recomendado): Ejemplos prácticos de flujos comunes.
  • Política de Rate Limiting (si aplica).
  • Política de Deprecación (si aplica).
  • Definición de relaciones HATEOAS personalizadas (si aplica).

🤔 ¿Por qué es Importante? / Beneficios Clave (Contexto)

  • Facilita la Adopción: Reduce la curva de aprendizaje.
  • Reduce Errores de Integración: Clarifica el contrato de la API.
  • Mejora la Productividad del Desarrollador: Sirve como referencia rápida.
  • Promueve la Consistencia: Ayuda a mantener la coherencia del diseño.
  • Habilita Herramientas: OAS permite generar SDKs, mocks, pruebas, etc.
  • Base para Pruebas: Define las expectativas.

✅ Buenas Prácticas y Recomendaciones Clave

Regla

9.6: Se refuerza la Norma 9.4: El uso de OpenAPI Specification (OAS) 3.x es obligatorio. 9.7: La descripción de la API en formato OAS debe generarse preferiblemente de forma automática a partir del código fuente (ej. usando anotaciones/decorators) para asegurar que la documentación y la implementación estén sincronizadas. Se debe integrar esta generación en el proceso de CI/CD. 9.8: Si la generación automática no es factible, la especificación OAS debe mantenerse manualmente con extrema diligencia y debe ser revisada como parte del proceso de revisión de código. 9.9: La documentación debe ser accesible públicamente (si la API es pública) o internamente (si es privada) a través de una interfaz de usuario interactiva generada a partir de la especificación OAS (ej. Swagger UI, ReDoc). 9.10: Las descripciones (description, summary) en la especificación OAS deben ser claras, concisas y escritas en un lenguaje técnico preciso pero accesible. 9.11: Se deben incluir ejemplos realistas de cuerpos de solicitud y respuesta en la especificación OAS para cada endpoint y modelo. 9.12: Los schemas de los modelos deben definir claramente los tipos de datos (string, number, integer, boolean, array, object), formatos (ej. date-time, uuid, email), si son requeridos (required), y restricciones (ej. minLength, maxLength, pattern, enum). 9.13: La documentación debe actualizarse antes o al mismo tiempo que se despliegan los cambios en la API. Está prohibido tener documentación desactualizada. 9.14: Además de la referencia OAS, se recomienda encarecidamente proporcionar guías conceptuales, tutoriales paso a paso y ejemplos de código en lenguajes populares para facilitar la integración.

Don'ts (Prohibido):

  • 9.15: No se debe publicar una API sin documentación completa y precisa.
  • 9.16: No se debe dejar la documentación desactualizada respecto a la implementación.
  • 9.17: No se debe usar descripciones vagas o incompletas en la especificación OAS.
  • 9.18: No se deben omitir ejemplos realistas.
  • 9.19: No se debe asumir que el consumidor entenderá la API solo leyendo el código o la especificación OAS sin descripciones.

💡 Ejemplos Prácticos (Ilustrativos)

Ejemplo 1: Fragmento de Especificación OAS (YAML) (Norma 9.4, 9.12)

openapi: 3.0.3
info:
title: API de Usuarios
version: 1.0.0
description: API para gestionar usuarios.
servers:
- url: https://api.example.com/v1
paths:
/users/{userId}:
get:
summary: Obtener un usuario por ID
description: Recupera los detalles de un usuario específico.
operationId: getUserById
tags:
- Usuarios
parameters:
- name: userId
in: path
required: true
description: El ID del usuario a recuperar.
schema:
type: string
format: uuid
responses:
'200':
description: Detalles del usuario.
content:
application/json:
schema:
$ref: '#/components/schemas/User'
example:
data:
userId: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
username: "johndoe"
email: "john.doe@example.com"
dateJoined: "2022-01-15T09:00:00Z"
_links:
- rel: "self"
href: "https://api.example.com/v1/users/f47ac10b-58cc-4372-a567-0e02b2c3d479"
method: "GET"
_meta:
timestamp: "2023-10-27T12:00:00Z"
version: "1.0.0"
'404':
description: Usuario no encontrado.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse' # Ref a formato de error estándar
components:
schemas:
User:
type: object
required:
- userId
- username
- email
- dateJoined
properties:
userId:
type: string
format: uuid
description: Identificador único del usuario.
readOnly: true # El cliente no puede enviar esto al crear/actualizar
username:
type: string
description: Nombre de usuario único.
minLength: 3
maxLength: 50
email:
type: string
format: email
description: Dirección de correo electrónico.
dateJoined:
type: string
format: date-time
description: Fecha y hora de registro (ISO 8601 UTC).
readOnly: true
ErrorResponse:
type: object
required:
- error
- _meta
- _links
properties:
error:
type: object
required:
- status
- error
- message
- code
properties:
status:
type: integer
error:
type: string
message:
type: string
code:
type: string
errors:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
_meta:
type: object
required:
- timestamp
- version
properties:
timestamp:
type: string
format: date-time
version:
type: string
_links:
type: array
items:
type: object
required:
- rel
- href
- method
properties:
rel:
type: string
href:
type: string
method:
type: string
enum: [GET, POST, PUT, DELETE, PATCH]

SuccessResponse:
type: object
required:
- data
- _meta
- _links
properties:
data:
type: object
_meta:
type: object
required:
- timestamp
- version
properties:
timestamp:
type: string
format: date-time
version:
type: string
pagination:
type: object
properties:
page:
type: integer
perPage:
type: integer
totalPages:
type: integer
totalItems:
type: integer
_links:
type: array
items:
type: object
required:
- rel
- href
- method
properties:
rel:
type: string
href:
type: string
method:
type: string
enum: [GET, POST, PUT, DELETE, PATCH]

Ejemplo 2: Interfaz de Usuario Interactiva (Norma 9.9)

La especificación OAS anterior se puede renderizar con herramientas como Swagger UI para proporcionar una interfaz donde los desarrolladores pueden:

  • Ver todos los endpoints y sus detalles.
  • Ver los schemas de los modelos.
  • Probar las llamadas a la API directamente desde el navegador (si está configurado).

🛠️ Herramientas y Consideraciones Adicionales (Contexto)

  • Swagger Editor/UI/Codegen: Ecosistema popular para OAS.
  • ReDoc: Alternativa para generar documentación visualmente atractiva.
  • Stoplight: Plataforma de diseño y documentación de APIs.
  • Frameworks de API: Muchos frameworks (NestJS, Spring Boot, FastAPI) tienen integración para generar OAS desde el código.
  • Linters OAS: Herramientas como Spectral pueden usarse para validar y asegurar la calidad de la especificación OAS.