Consumo de APIs REST desde Python (requests, httpx)

1 Introducción

Python es uno de los lenguajes más usados para interactuar con APIs REST, tanto en:

  • Automatización (scripts que consultan APIs de terceros).
  • Backend (servicios que consumen APIs externas).
  • Data science (descargar datos de APIs para análisis).

👉 Las dos librerías más comunes son: requests (sencilla y estable) y httpx (moderna, con soporte de asincronía).

2 Consumo de APIs con requests

Instalación

pip install requests

Ejemplo 1 — GET básico

import requests

resp = requests.get("https://jsonplaceholder.typicode.com/users/1")

if resp.status_code == 200:
    data = resp.json()
    print("Usuario:", data["name"], "-", data["email"])
else:
    print("Error:", resp.status_code)

👉 Flujo: petición → verificar código → convertir a JSON → procesar datos.

Ejemplo 2 — POST con JSON

import requests

nuevo_post = {
    "title": "Nuevo Post",
    "body": "Contenido de ejemplo",
    "userId": 1
}

resp = requests.post("https://jsonplaceholder.typicode.com/posts", json=nuevo_post)

print("Status:", resp.status_code)
print("Respuesta:", resp.json())

👉 Con el parámetro json=, requests convierte automáticamente el objeto Python en JSON.

Ejemplo 3 — PUT (actualizar recurso completo)

import requests

actualizar = {
    "id": 1,
    "title": "Título actualizado",
    "body": "Contenido modificado",
    "userId": 1
}

resp = requests.put("https://jsonplaceholder.typicode.com/posts/1", json=actualizar)
print("Respuesta:", resp.json())

Ejemplo 4 — PATCH (actualización parcial)

import requests

cambio = { "title": "Título con PATCH" }

resp = requests.patch("https://jsonplaceholder.typicode.com/posts/1", json=cambio)
print("Respuesta:", resp.json())

Ejemplo 5 — DELETE

import requests

resp = requests.delete("https://jsonplaceholder.typicode.com/posts/1")
print("Código de estado:", resp.status_code)

3 Manejo de headers personalizados

En muchas APIs, hay que enviar tokens de autenticación en el header.

import requests

headers = {
    "Authorization": "Bearer 12345",
    "Accept": "application/json"
}

resp = requests.get("https://api.ejemplo.com/pedidos", headers=headers)
print(resp.status_code, resp.json())

4 Consumo de APIs con httpx

Instalación

pip install httpx

Características principales

  • Similar a requests, pero con soporte para async/await.
  • Mejor rendimiento en aplicaciones que hacen muchas peticiones concurrentes.

Ejemplo 1 — GET con httpx (síncrono)

import httpx

resp = httpx.get("https://jsonplaceholder.typicode.com/users/1")
print(resp.status_code, resp.json())

Ejemplo 2 — GET con httpx (asíncrono)

import httpx
import asyncio

async def main():
    async with httpx.AsyncClient() as client:
        resp = await client.get("https://jsonplaceholder.typicode.com/users")
        print(resp.status_code)
        print(resp.json())

asyncio.run(main())

👉 Ideal cuando hay que consultar varias APIs en paralelo sin bloquear el programa.

Ejemplo 3 — POST con httpx

import httpx

nuevo_usuario = { "nombre": "Laura", "email": "laura@ejemplo.com" }

resp = httpx.post("https://jsonplaceholder.typicode.com/users", json=nuevo_usuario)
print(resp.status_code, resp.json())

Ejemplo 4 — Headers en httpx

import httpx

headers = {
    "Authorization": "Bearer 12345",
    "Accept": "application/json"
}

resp = httpx.get("https://api.ejemplo.com/datos", headers=headers)
print(resp.json())

5 Manejo de errores en Python

Tanto con requests como con httpx es importante capturar excepciones:

import requests

try:
    resp = requests.get("https://api.ejemplo.com/datos", timeout=5)
    resp.raise_for_status()  # Lanza error si no es 200-299
    print(resp.json())
except requests.exceptions.Timeout:
    print("La petición tardó demasiado")
except requests.exceptions.HTTPError as err:
    print("Error HTTP:", err)
except Exception as e:
    print("Error general:", e)

👉 Esto evita que el programa se rompa si la API falla.

6 Ejemplo práctico: consultar una lista de productos

import requests

url = "https://jsonplaceholder.typicode.com/posts"

resp = requests.get(url)
if resp.status_code == 200:
    productos = resp.json()
    for p in productos[:5]:
        print(f"ID: {p['id']} - Título: {p['title']}")
else:
    print("Error al obtener productos:", resp.status_code)

👉 Simulación de obtener productos de una tienda usando JSONPlaceholder.

7 ¿Cuándo usar requests y cuándo httpx?

requests

  • Ideal para scripts simples y proyectos pequeños.
  • Muy estable y ampliamente soportado.

httpx

  • Ideal para aplicaciones modernas con alta concurrencia.
  • Soporta HTTP/2, timeouts más precisos y asincronía.

8 Buenas prácticas en Python para consumo de APIs

  • Usar timeout para evitar bloqueos (timeout=5).
  • Manejar errores con try/except.
  • Reutilizar clientes (Session en requests, AsyncClient en httpx) en lugar de abrir conexión cada vez.
  • Guardar tokens y credenciales en variables de entorno (no en el código).
  • Validar siempre la estructura de la respuesta antes de usarla.

9 Conclusión del capítulo

Python es excelente para consumir APIs REST gracias a librerías como requests y httpx.

  • requests es simple y confiable para la mayoría de los casos.
  • httpx aporta asincronía y mayor rendimiento en aplicaciones modernas.
  • Es fundamental manejar headers, errores y timeouts correctamente.

👉 En resumen: con Python, consumir APIs REST es rápido, seguro y flexible.