Requests, APIs y JSON en Python: integración robusta con servicios externos

Aprende a consumir APIs REST con control de errores HTTP, timeouts y parseo JSON defensivo para flujos de backend confiables.

Consumir APIs no es solo hacer un GET: hay que validar estado HTTP, tiempos de espera, formato de respuesta y errores de red.

La librería `requests` simplifica llamadas HTTP, pero necesitas usarla con reglas defensivas para producción.

JSON suele ser el formato estándar de intercambio entre servicios, y debe parsearse con validaciones mínimas de estructura.

Un cliente robusto separa capa HTTP de lógica de negocio para testear y evolucionar mejor.

  • Nunca llames una API sin timeout: podrías bloquear proceso indefinidamente.
  • `requests.get(url, timeout=5)` evita bloqueos eternos cuando el servicio externo se degrada.
  • `response.status_code` y `response.raise_for_status()` son controles básicos para detectar respuestas no exitosas.
  • No mezcles validación HTTP con lógica de negocio; encapsula cliente en funciones dedicadas.
  • Que llegue JSON no significa que tenga la estructura esperada.

1) Llamadas HTTP con `requests` y timeout

Nunca llames una API sin timeout: podrías bloquear proceso indefinidamente.

`requests.get(url, timeout=5)` evita bloqueos eternos cuando el servicio externo se degrada.

`response.status_code` y `response.raise_for_status()` son controles básicos para detectar respuestas no exitosas.

No mezcles validación HTTP con lógica de negocio; encapsula cliente en funciones dedicadas.

2) Parseo JSON defensivo

Que llegue JSON no significa que tenga la estructura esperada.

Valida claves obligatorias antes de usar datos (`id`, `status`, `data`, etc.).

`dict.get(...)` con fallback ayuda, pero en campos críticos conviene fallar explícitamente con mensaje claro.

Si el contrato de API cambia, una validación temprana evita errores silenciosos en capas superiores.

3) Manejo de errores de red y API

Distingue fallos de red, timeout y errores HTTP para responder correctamente.

`requests.exceptions.Timeout` indica latencia excesiva; `ConnectionError` apunta a fallo de conectividad.

`HTTPError` significa que el servidor respondió, pero con estado no 2xx.

Registrar contexto (endpoint, método, request_id) acelera diagnóstico en producción.

  • Usa timeout explícito en todas las llamadas.
  • Valida `status_code` y estructura JSON.
  • Separa cliente HTTP de reglas de negocio.
  • Registra contexto útil para soporte.
Python
19

Requests, APIs y JSON en Python: integración robusta con servicios externos

Aprende a consumir APIs REST con control de errores HTTP, timeouts y parseo JSON defensivo para flujos de backend confiables.

Código del tema: Automatizacion y codigo legible en Python

📘 Teoría

1) Llamadas HTTP con `requests` y timeout

Nunca llames una API sin timeout: podrías bloquear proceso indefinidamente.

1

`requests.get(url, timeout=5)` evita bloqueos eternos cuando el servicio externo se degrada.

2

`response.status_code` y `response.raise_for_status()` son controles básicos para detectar respuestas no exitosas.

3

No mezcles validación HTTP con lógica de negocio; encapsula cliente en funciones dedicadas.

GET con validación de estado
import requests


def obtener_usuario(user_id: int) -> dict:
    url = f'https://api.ejemplo.com/users/{user_id}'
    response = requests.get(url, timeout=5)
    response.raise_for_status()
    return response.json()

2) Parseo JSON defensivo

Que llegue JSON no significa que tenga la estructura esperada.

Valida claves obligatorias antes de usar datos (`id`, `status`, `data`, etc.).

`dict.get(...)` con fallback ayuda, pero en campos críticos conviene fallar explícitamente con mensaje claro.

Si el contrato de API cambia, una validación temprana evita errores silenciosos en capas superiores.

1

Extracción segura con `get`

Fallback para campos opcionales.

2

Validación de campos obligatorios

Fallar rápido cuando contrato no se cumple.

3) Manejo de errores de red y API

Distingue fallos de red, timeout y errores HTTP para responder correctamente.

`requests.exceptions.Timeout` indica latencia excesiva; `ConnectionError` apunta a fallo de conectividad.

`HTTPError` significa que el servidor respondió, pero con estado no 2xx.

Registrar contexto (endpoint, método, request_id) acelera diagnóstico en producción.

  • Usa timeout explícito en todas las llamadas.
  • Valida `status_code` y estructura JSON.
  • Separa cliente HTTP de reglas de negocio.
  • Registra contexto útil para soporte.
Manejo específico de errores
import requests


def obtener_json(url: str) -> dict:
    try:
        r = requests.get(url, timeout=5)
        r.raise_for_status()
        return r.json()
    except requests.exceptions.Timeout:
        raise RuntimeError('Timeout al consultar API')
    except requests.exceptions.ConnectionError:
        raise RuntimeError('Error de conexión con API')
    except requests.exceptions.HTTPError as e:
        raise RuntimeError(f'Error HTTP: {e.response.status_code}')

🧪 Aprende probando

Ejemplo Ejemplo: leer datos críticos de payload Parsea JSON y extrae estado/nombre con validación mínima.

🏁 Retos

Reto Reto: extrae `status` del JSON Implementa la lectura de estado desde el payload para usarlo en lógica posterior.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre Python.

Test de Python

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .