Swagger Documentation
En el mundo de las APIs modernas, donde la documentación precisa y actualizada es crucial para el éxito de cualquier plataforma, Swagger emerge como el estándar de facto para documentar interfaces REST. En KodeChain, este sistema no solo documenta endpoints; crea una experiencia interactiva que permite a desarrolladores explorar, probar y entender la API sin escribir una sola línea de código.
La Arquitectura de Swagger
Generación Automática desde Código
//go:generate swag init -g main.go -o docs/
Un simple comando genera toda la documentación desde comentarios especiales en el código Go.
Estructura de Archivos Generados
docs/
├── docs.go # Código Go generado con especificaciones
├── swagger.json # Especificación OpenAPI 2.0 en JSON
└── swagger.yaml # Especificación OpenAPI 2.0 en YAML
Tres formatos diferentes para diferentes necesidades y herramientas.
Comentarios que Generan Documentación
Estructura de Comentarios
// getBlockchainStatus godoc
// @Summary Get blockchain status
// @Description Get the status of both DPOS and PBFT chains
// @Tags blockchain
// @Accept json
// @Produce json
// @Success 200 {object} map[string]interface{}
// @Router /api/blockchain/status [get]
func (s *Server) getBlockchainStatus(c *gin.Context) {
// Implementación...
}
Cada comentario especial se traduce automáticamente en documentación Swagger.
Tags para Organización
// @Tags blockchain,transactions,staking,sync
Los tags agrupan endpoints relacionados, creando secciones lógicas en la documentación.
Definiciones de Respuesta
// @Success 200 {object} endpoints.BlockchainStatusResponse
// @Failure 400 {object} endpoints.ErrorResponse
// @Failure 500 {object} endpoints.ErrorResponse
Especifican exactamente qué estructura de datos retorna cada endpoint.
Especificación OpenAPI 2.0
Información General
{
"swagger": "2.0",
"info": {
"description": "API for KodeChain blockchain node",
"title": "KodeChain Node API",
"contact": {},
"version": "1.0"
},
"host": "localhost:8080",
"basePath": "/",
"schemes": ["http", "https"]
}
La metadata básica que describe la API completa.
Definiciones de Tipos
"definitions": {
"endpoints.CreateTransactionRequest": {
"type": "object",
"properties": {
"amount": {
"type": "integer"
},
"data": {
"type": "string"
},
"from": {
"type": "string"
},
"signature": {
"type": "string"
},
"to": {
"type": "string"
},
"type": {
"description": "\"transfer\", \"stake\", \"unstake\"",
"type": "string"
}
},
"type": "object"
}
}
Cada struct Go se convierte automáticamente en una definición de tipo OpenAPI.
Paths y Operaciones
"/api/transaction/create": {
"post": {
"description": "Create a new transaction and add it to the mempool",
"consumes": ["application/json"],
"produces": ["application/json"],
"tags": ["transactions"],
"summary": "Create a new transaction",
"parameters": [
{
"description": "Transaction creation request",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/endpoints.CreateTransactionRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/endpoints.CreateTransactionResponse"
}
}
}
}
}
Cada endpoint se describe completamente: método HTTP, parámetros, respuestas, tipos de contenido.
Interfaz Swagger UI
Explorador Interactivo
<!DOCTYPE html>
<html>
<head>
<title>Swagger UI</title>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3.25.0/swagger-ui.css" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@3.25.0/swagger-ui-bundle.js"></script>
<script>
const ui = SwaggerUIBundle({
url: '/swagger.json',
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIBundle.SwaggerUIStandalonePreset
]
});
</script>
</body>
</html>
La interfaz web que permite explorar la API interactivamente.
Funcionalidades Interactivas
- Try it out: Ejecutar llamadas API directamente desde el navegador
- Authentication: Soporte para diferentes métodos de autenticación
- Request/Response Examples: Ejemplos reales de uso
- Schema Validation: Validación automática de parámetros
Headers Especiales
X-Consensus-Type
parameters:
- name: X-Consensus-Type
in: header
description: Consensus type (DPOS or PBFT)
required: true
type: string
enum: [DPOS, PBFT]
Header crítico que especifica qué cadena debe procesar la solicitud.
Content-Type y Accept
consumes:
- application/json
produces:
- application/json
Especifica los formatos de datos soportados.
Manejo de Errores en Documentación
Códigos de Estado
responses:
"200":
description: "OK"
"400":
description: "Bad Request"
schema:
$ref: "#/definitions/endpoints.ErrorResponse"
"401":
description: "Unauthorized"
"403":
description: "Forbidden"
"404":
description: "Not Found"
"500":
description: "Internal Server Error"
Cada código de estado está documentado con su significado y estructura de respuesta.
Estructuras de Error
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"code": {
"type": "integer"
},
"details": {
"type": "string"
}
}
}
Formato consistente para todas las respuestas de error.
Versionado de API
Versiones en Paths
basePath: /v1
Soporte para versionado de API a través de paths.
Versiones en Headers
parameters:
- name: X-API-Version
in: header
type: string
default: "1.0"
Headers opcionales para especificar versión deseada.
Seguridad en Documentación
Autenticación
securityDefinitions:
BearerAuth:
type: apiKey
name: Authorization
in: header
ApiKeyAuth:
type: apiKey
name: X-API-Key
in: header
Definición de métodos de autenticación soportados.
Rate Limiting
responses:
"429":
description: "Too Many Requests"
headers:
X-RateLimit-Limit:
type: integer
description: Request limit
X-RateLimit-Remaining:
type: integer
description: Remaining requests
X-RateLimit-Reset:
type: string
description: Reset time
Documentación de límites de rate limiting.
Testing Automatizado
Validación de Esquemas
// Validar que la respuesta cumple con el esquema
const Ajv = require('ajv');
const ajv = new Ajv();
const validate = ajv.compile(schema);
const valid = validate(responseData);
if (!valid) {
console.error('Response validation failed:', validate.errors);
}
Validación automática de que las respuestas cumplen con los esquemas documentados.
Tests de Contrato
func TestAPIContract(t *testing.T) {
// Cargar especificación Swagger
spec := loadSwaggerSpec("docs/swagger.json")
// Probar cada endpoint
for path, operations := range spec.Paths {
for method, operation := range operations {
t.Run(fmt.Sprintf("%s_%s", method, path), func(t *testing.T) {
// Ejecutar request
response := makeRequest(method, path)
// Validar contra esquema
validateResponse(response, operation.Responses)
})
}
}
}
Tests que aseguran que la implementación cumple con la documentación.
Integración con Herramientas
Generación de Clientes
# Generar cliente TypeScript
swagger-codegen generate -i swagger.json -l typescript-fetch -o client-ts
# Generar cliente Go
swagger-codegen generate -i swagger.json -l go -o client-go
# Generar cliente Python
swagger-codegen generate -i swagger.json -l python -o client-py
Generación automática de bibliotecas cliente en múltiples lenguajes.
Testing con Postman/Newman
{
"info": {
"name": "KodeChain API Tests",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Create Transaction",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{\"from\":\"0x1000...\",\"to\":\"0x1000...\",\"amount\":1000000000000000000}"
},
"url": {
"raw": "{{baseUrl}}/api/transaction/create",
"host": ["{{baseUrl}}"],
"path": ["api", "transaction", "create"]
}
}
}
]
}
Colecciones de Postman generadas automáticamente desde Swagger.
Mantenimiento y Evolución
Actualización Automática
# En el pipeline CI/CD
swag init -g main.go -o docs/
git add docs/
git commit -m "Update API documentation"
La documentación se mantiene actualizada automáticamente con cada cambio de código.
Versionado Semántico
info:
version: "2.1.0"
title: "KodeChain Node API"
description: |
API for KodeChain blockchain node
## Changelog
### 2.1.0
- Added new staking endpoints
- Enhanced error responses
### 2.0.0
- Breaking change: New consensus types
- Added PBFT support
Historial de cambios documentado junto con la especificación.
El Rol en el Desarrollo
Documentación Viva
La documentación Swagger no es un documento estático; es una representación viva del código que:
- Se actualiza automáticamente: Con cada cambio en el código
- Es testable: Los ejemplos se pueden ejecutar directamente
- Es explorable: Los desarrolladores pueden experimentar sin riesgo
- Es generativa: Crea clientes y tests automáticamente
Puente entre Equipos
// Para el backend developer
func createTransaction(c *gin.Context) {
// Implementación técnica
}
// Para el frontend developer
// POST /api/transaction/create
// Body: {from, to, amount}
// Response: {success, transaction_hash}
La documentación Swagger traduce código técnico en contratos comprensibles.
Calidad y Consistencia
# Esquemas estrictos aseguran consistencia
definitions:
Transaction:
type: object
required: [from, to, amount]
properties:
from: {type: string, pattern: '^0x[a-fA-F0-9]{40}$'}
to: {type: string, pattern: '^0x[a-fA-F0-9]{40}$'}
amount: {type: integer, minimum: 0}
Validaciones estrictas que mejoran la calidad de la API.
El Arte de la Documentación
Cada comentario @Summary, cada @Parameter, cada @Response representa un puente entre la complejidad técnica y la usabilidad práctica. La documentación Swagger de KodeChain no solo describe una API; crea una experiencia donde desarrolladores pueden entender, probar y confiar en cada endpoint.
Desde el primer swag init hasta la interfaz interactiva final, Swagger transforma el código en conocimiento accesible, permitiendo que equipos construyan sobre KodeChain con confianza y precisión.