Guía de Pruebas y Depuración de API: De cURL a Herramientas en Línea
Herramientas de desarrollo
Métodos de Solicitud HTTP
| Método | Uso | Idempotente | Seguro |
|---|---|---|---|
| GET | Obtener recurso | ✅ | ✅ |
| POST | Crear recurso | ❌ | ❌ |
| PUT | Actualización completa | ✅ | ❌ |
| PATCH | Actualización parcial | ❌ | ❌ |
| DELETE | Eliminar recurso | ✅ | ❌ |
| HEAD | Obtener encabezados | ✅ | ✅ |
| OPTIONS | Preflight CORS | ✅ | ✅ |
Encabezados de Solicitud Comunes
| Encabezado | Descripción | Ejemplo |
|---|---|---|
Content-Type |
Formato del cuerpo | application/json |
Accept |
Formato de respuesta esperado | application/json |
Authorization |
Información de autenticación | Bearer token... |
User-Agent |
Identificación del cliente | Mozilla/5.0... |
Cookie |
Cookie | session=abc123 |
X-Request-ID |
ID de seguimiento de solicitud | UUID |
Valores Comunes de Content-Type
| Valor | Uso |
|---|---|
application/json |
Datos JSON |
application/x-www-form-urlencoded |
Datos de formulario |
multipart/form-data |
Subida de archivos |
text/plain |
Texto plano |
text/html |
HTML |
Métodos de Autenticación
1. Bearer Token (el más usado)
# cURL
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
https://api.example.com/users
# JavaScript
fetch('https://api.example.com/users', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9...',
},
});
2. Basic Auth
# cURL (codificación automática)
curl -u username:password https://api.example.com/users
# Codificación manual
# Base64("username:password") = "dXNlcm5hbWU6cGFzc3dvcmQ="
curl -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
https://api.example.com/users
3. API Key
# Método 1: Header
curl -H "X-API-Key: your-api-key" \
https://api.example.com/users
# Método 2: Parámetro de consulta
curl "https://api.example.com/users?api_key=your-api-key"
Detalle del Comando cURL
Solicitud GET Básica
# GET más simple
curl https://api.example.com/users
# Mostrar encabezados de respuesta
curl -i https://api.example.com/users
# Solo mostrar encabezados de respuesta
curl -I https://api.example.com/users
# Seguir redirecciones
curl -L https://example.com/redirect
Solicitud POST
# Datos JSON
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "email": "alice@example.com"}'
# Datos de formulario
curl -X POST https://api.example.com/users \
-d "name=Alice&email=alice@example.com"
# Subida de archivo
curl -X POST https://api.example.com/upload \
-F "file=@photo.jpg" \
-F "description=My photo"
Opciones Avanzadas
# Configuración de tiempo de espera
curl --connect-timeout 5 --max-time 30 https://api.example.com
# Guardar en archivo
curl -o response.json https://api.example.com/users
# Modo silencioso (sin barra de progreso)
curl -s https://api.example.com/users
# Salida detallada (para depuración)
curl -v https://api.example.com/users
# Ignorar verificación de certificado SSL (solo entorno de desarrollo)
curl -k https://self-signed.example.com
# Proxy
curl -x http://proxy:8080 https://api.example.com
# Cookie
curl -b "session=abc123" https://api.example.com/users
# Guardar y enviar Cookie
curl -c cookies.txt -b cookies.txt https://api.example.com/users
Códigos de Estado HTTP Comunes
| Código | Significado | Causa Común |
|---|---|---|
| 200 | OK | Éxito |
| 201 | Created | POST creado exitosamente |
| 204 | No Content | DELETE exitoso |
| 301 | Moved Permanently | Redirección permanente |
| 304 | Not Modified | Caché acertada |
| 400 | Bad Request | Parámetros incorrectos |
| 401 | Unauthorized | No autenticado |
| 403 | Forbidden | Sin permisos |
| 404 | Not Found | Recurso no existe |
| 409 | Conflict | Conflicto de recurso |
| 422 | Unprocessable Entity | Validación fallida |
| 429 | Too Many Requests | Limitación de tasa |
| 500 | Internal Server Error | Error del servidor |
| 502 | Bad Gateway | Servicio upstream no disponible |
| 503 | Service Unavailable | Servicio sobrecargado |
Usar ToolsKu para Probar API
Convertir cURL a Código
- Abrir Herramienta cURL a Código
- Pegar el comando cURL
- Seleccionar el lenguaje destino (JavaScript/Python/Go/Java, etc.)
- Copiar el código generado
Ejemplo
# Entrada cURL
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer token123" \
-d '{"name": "Alice"}'
Convertido a JavaScript:
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123',
},
body: JSON.stringify({ name: 'Alice' }),
});
const data = await response.json();
Técnicas de Depuración de API
1. Ver Solicitud/Respuesta Completa
# -v muestra información detallada
curl -v https://api.example.com/users
# Salida:
> GET /users HTTP/1.1 ← Línea de solicitud
> Host: api.example.com ← Encabezado de solicitud
> Authorization: Bearer ...
>
< HTTP/1.1 200 OK ← Línea de respuesta
< Content-Type: application/json ← Encabezado de respuesta
< X-RateLimit-Remaining: 99
<
[{"id": 1, "name": "Alice"}] ← Cuerpo de respuesta
2. Formatear Respuesta JSON
# Usar jq para formatear
curl -s https://api.example.com/users | jq
# Usar python
curl -s https://api.example.com/users | python -m json.tool
# O usar la herramienta de formateo JSON de ToolsKu
3. Medir Tiempo de Respuesta
# Estadísticas detalladas de tiempo
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://api.example.com/users
# Salida:
# DNS: 0.012s
# Connect: 0.035s
# TTFB: 0.120s
# Total: 0.125s
4. Solucionar Problemas de CORS
Error del navegador:
Access to fetch at 'https://api.example.com' from origin 'https://app.example.com'
has been blocked by CORS policy
Pasos para solucionar:
1. Verificar solicitud preflight OPTIONS
curl -X OPTIONS -H "Origin: https://app.example.com" \
-H "Access-Control-Request-Method: POST" \
-i https://api.example.com/users
2. Verificar encabezados de respuesta
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
5. Solucionar Problemas de Autenticación
Solución de 401 Unauthorized:
1. ¿El Token expiró? → Usar herramienta de decodificación JWT para verificar exp
2. ¿El formato del Token es correcto? → Verificar prefijo Bearer
3. ¿Se envió el Token? → curl -v verificar encabezados de solicitud
Solución de 403 Forbidden:
1. ¿El usuario tiene permisos? → Verificar rol del usuario
2. ¿La IP está en la lista blanca? → Verificar registros del servidor
3. ¿Se excedió el límite de frecuencia? → Verificar código de estado 429
Mejores Prácticas de Pruebas de API
1. Gestión de Variables de Entorno
# Usar variables de entorno para almacenar información sensible
export API_BASE="https://api.example.com"
export API_TOKEN="your-token"
curl -H "Authorization: Bearer $API_TOKEN" "$API_BASE/users"
2. Colección de Solicitudes
#!/bin/bash
# api-test.sh
BASE="https://api.example.com"
TOKEN="Bearer $API_TOKEN"
HEADER="-H 'Content-Type: application/json' -H 'Authorization: $TOKEN'"
# Obtener lista de usuarios
get_users() { curl -s $HEADER "$BASE/users" | jq; }
# Crear usuario
create_user() { curl -s -X POST $HEADER -d "$1" "$BASE/users" | jq; }
# Obtener un usuario
get_user() { curl -s $HEADER "$BASE/users/$1" | jq; }
# Uso
get_users
create_user '{"name":"Bob"}'
get_user 1
3. Pruebas Automatizadas
// Escribir pruebas de API con fetch
async function testApi() {
// Probar GET
const listRes = await fetch('/api/users');
console.assert(listRes.status === 200, 'GET /users should return 200');
// Probar POST
const createRes = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Test' }),
});
console.assert(createRes.status === 201, 'POST /users should return 201');
const created = await createRes.json();
console.assert(created.name === 'Test', 'Name should match');
}
Preguntas Frecuentes
¿Problemas con las comillas de cURL en Windows?
Windows CMD usa comillas dobles, PowerShell tiene problemas de escape:
# En PowerShell, cURL es un alias de Invoke-WebRequest
# Usar curl.exe para invocar el cURL real
curl.exe -X POST https://api.example.com/users `
-H "Content-Type: application/json" `
-d '{\"name\": \"Alice\"}'
¿Cómo solucionar tiempos de espera?
1. ¿DNS lento? → curl -w verificar time_namelookup
2. ¿Conexión lenta? → curl -w verificar time_connect
3. ¿Procesamiento del servidor lento? → curl -w verificar time_starttransfer - time_connect
4. ¿Transmisión de respuesta lenta? → curl -w verificar time_total - time_starttransfer
Resumen
La depuración de API es parte del día a día del desarrollador: dominar los comandos cURL, los códigos de estado HTTP, los métodos de autenticación y las técnicas de depuración permite localizar rápidamente problemas de interfaz. La Herramienta cURL a Código y la Herramienta de Formateo JSON de ToolsKu son excelentes compañeras para la depuración de API, ayudándote a probar interfaces y revisar respuestas rápidamente.
#API testing#HTTP requests#cURL#API debugging#tutorial