Los problemas de red pueden causar que las peticiones de API fallen. Aquí está cómo manejar timeouts y problemas de conexión de forma elegante.
Configurar timeouts apropiados
Siempre configura timeouts para evitar peticiones colgadas:
// JavaScript con fetch
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000); // 30s
try {
const response = await fetch('https://api.cathopic.com/resources', {
method: 'POST',
headers: {
'x-api-key': apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({ query: 'Jesús' }),
signal: controller.signal
});
clearTimeout(timeout);
return await response.json();
} catch (error) {
clearTimeout(timeout);
if (error.name === 'AbortError') {
console.error('Petición agotó timeout después de 30s');
} else {
console.error('Error de red:', error);
}
throw error;
}
// Python con requests
import requests
from requests.exceptions import Timeout, RequestException
try:
response = requests.post(
'https://api.cathopic.com/resources',
headers={'x-api-key': api_key},
json={'query': 'Jesús'},
timeout=30 # 30 segundos
)
return response.json()
except Timeout:
print('Petición agotó timeout después de 30s')
raise
except RequestException as e:
print(f'Error de red: {e}')
raise
Errores de red comunes
Timeout de conexión:
No se puede establecer conexión al servidor
Usualmente problema de red o firewall
Verifica conexión a internet
Verifica que firewall permita HTTPS a api.cathopic.com
Timeout de lectura:
Conexión establecida pero sin respuesta
El servidor puede estar lento o sobrecargado
Aumenta timeout o reintenta más tarde
Fallo de resolución DNS:
No puede resolver api.cathopic.com
Problema con servidor DNS
Inténtalo de nuevo o verifica configuración DNS
Reintentar con retroceso
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000);
const response = await fetch(url, {
...options,
signal: controller.signal
});
clearTimeout(timeout);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
const isLastAttempt = attempt === maxRetries - 1;
if (isLastAttempt) {
console.error(`Todos los ${maxRetries} intentos fallaron`);
throw error;
}
const waitTime = Math.pow(2, attempt) * 1000;
console.log(`Intento ${attempt + 1} falló. Reintentando en ${waitTime}ms...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
}
}
}
Valores de timeout recomendados
Timeout de conexión: 10 segundos
Timeout de lectura: 30 segundos
Búsqueda /resources: 30 segundos
Licenciamiento /confirm: 30 segundos
Depurar problemas de red
Usa curl para probar conectividad:
# Probar conectividad básica
curl -v https://api.cathopic.com/resources
# Probar con timeout
curl --max-time 30 -X POST https://api.cathopic.com/resources \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{"query": "test"}'
Verifica:
✓ DNS resuelve api.cathopic.com
✓ Conexión SSL/TLS tiene éxito
✓ Se recibe respuesta HTTP
✓ Tiempo de respuesta razonable (<5s típicamente)
Si los problemas persisten, contacta con soporte con detalles de diagnóstico de red.