Guía Completa del Paquete Requests en Python 🐍

El paquete requests es una biblioteca poderosa y fácil de usar para realizar solicitudes HTTP en Python. Esta guía cubre todos los métodos principales (GET, POST, PUT, DELETE, etc.) con ejemplos prácticos.

Instalación

Primero, instala el paquete con pip si no lo tienes aún:

bash
pip install requests

Métodos Principales


1Métodos GET:

El método GET se utiliza para obtener datos de un servidor.

Ejemplo:

python
import requests

try:
  response = requests.get("https://jsonplaceholder.typicode.com/posts/1", timeout=10)  # Timeout para evitar bloqueos
  response.raise_for_status()  # Lanza una excepción para códigos de error HTTP (4xx, 5xx)
  data = response.json()  # Procesar el JSON de la respuesta
  print(data)
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")  # Manejo de errores HTTP específicos
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")  # Manejo general de errores de requests
  Explicación

  • try/except: Maneja errores como fallos de conexión, tiempo de espera, o códigos de estado HTTP problemáticos.
  • timeout: Evita bloqueos prolongados si el servidor no responde.
  • raise_for_status: Detecta errores HTTP automáticamente y lanza una excepción para manejarlo.

Parámetros en una solicitud GET

Puedes pasar parámetros a la URL usando el argumento params.

Ejemplo:

python
import requests

# Definir los parámetros de consulta
params = {"userId": 1}

try:
  # Realizar la solicitud GET con parámetros
  response = requests.get("https://jsonplaceholder.typicode.com/posts", params=params, timeout=10)
  response.raise_for_status()  # Lanza una excepción para errores HTTP
  
  # Procesar la respuesta
  data = response.json()
  print("Posts del usuario 1:")
  for post in data:
      print(f"- {post['id']}: {post['title']}")
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
  Explicación

  • timeout: Establecido para evitar bloqueos.
  • raise_for_status: Detecta y maneja errores HTTP automáticamente. Iteración en la respuesta JSON: Muestra los resultados de forma más clara y estructurada.
  • try/except: Para manejar posibles errores en la solicitud.

2Método POST

El método POST se usa para enviar datos al servidor.

Ejemplo:

python
import requests

# Datos a enviar en la solicitud POST
data = {
  "title": "foo",
  "body": "bar",
  "userId": 1
}

try:
  # Realizar la solicitud POST
  response = requests.post("https://jsonplaceholder.typicode.com/posts", json=data, timeout=10)
  response.raise_for_status()  # Lanza una excepción para errores HTTP

  # Procesar y mostrar la respuesta
  created_post = response.json()
  print("Post creado con éxito:")
  print(f"ID: {created_post['id']}")
  print(f"Título: {created_post['title']}")
  print(f"Contenido: {created_post['body']}")
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
  Explicación

  • timeout: Evita bloqueos si el servidor no responde.
  • raise_for_status: Detecta y maneja errores HTTP automáticamente.
  • Formato de salida: Muestra los datos de la respuesta de forma estructurada.
  • try/except: Para manejar errores relacionados con la solicitud.

3Método PUT:

El método PUT se usa para actualizar datos existentes.

Ejemplo:

python
import requests

# Datos para actualizar el post
data = {
  "title": "updated title",
  "body": "updated body"
}

try:
  # Realizar la solicitud PUT
  response = requests.put("https://jsonplaceholder.typicode.com/posts/1", json=data, timeout=10)
  response.raise_for_status()  # Lanza una excepción si ocurre un error HTTP

  # Procesar y mostrar la respuesta
  updated_post = response.json()
  print("Post actualizado con éxito:")
  print(f"ID: {updated_post['id']}")
  print(f"Título: {updated_post['title']}")
  print(f"Contenido: {updated_post['body']}")
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
  Explicación

  • timeout: Establecido para evitar bloqueos prolongados.
  • raise_for_status: Lanza excepciones para manejar errores HTTP automáticamente.
  • Salida estructurada: Muestra los datos de la respuesta de forma clara y ordenada.
  • try/except: Para manejar errores relacionados con la solicitud y asegurar robustez en el código.

4Método DELETE:

El método DELETE elimina un recurso.

Ejemplo:

python
import requests

try:
  # Realizar la solicitud DELETE
  response = requests.delete("https://jsonplaceholder.typicode.com/posts/1", timeout=10)
  response.raise_for_status()  # Lanza una excepción para errores HTTP

  # Verificar la respuesta
  if response.status_code == 200:
      print("El recurso fue eliminado exitosamente.")
  else:
      print(f"Eliminación no completada. Código de estado: {response.status_code}")
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
  Explicación

  • timeout: Evita bloqueos prolongados si el servidor no responde.
  • raise_for_status: Detecta y maneja errores HTTP automáticamente.
  • Mensajes más claros: Describe mejor el estado de la operación.
  • try/except: Añade robustez para manejar posibles errores en la solicitud.

Otros Aspectos Útiles


Headers personalizados

Puedes enviar encabezados HTTP personalizados usando el parámetro headers.

Ejemplo:

python
import requests

# Encabezados personalizados
headers = {
  "Authorization": "Bearer YOUR_TOKEN",
  "User-Agent": "MyApp/1.0"
}

try:
  # Realizar la solicitud GET con encabezados personalizados
  response = requests.get("https://api.example.com/data", headers=headers, timeout=10)
  response.raise_for_status()  # Lanza una excepción para errores HTTP

  # Procesar la respuesta
  data = response.json()
  print("Datos obtenidos exitosamente:")
  for item in data:
      print(f"- {item}")  # Ajusta según la estructura de la respuesta
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
  Explicación

  • timeout: Evita que el código quede bloqueado si el servidor no responde.
  • raise_for_status: Detecta automáticamente errores HTTP y los maneja.
  • Salida formateada: Itera y muestra los datos de la respuesta de manera más clara.
  • Manejo de errores: try/except para capturar excepciones específicas y generales.
  • Encabezados adicionales: Incluye un User-Agent como buena práctica.

Manejo de Sesiones

Las sesiones permiten mantener datos como cookies entre solicitudes.

Ejemplo:

python
import requests

session = requests.Session()
session.headers.update({"User-Agent": "my-app"})

response = session.get("https://jsonplaceholder.typicode.com/posts/1")
print(response.json())

Subir archivos

Puedes subir archivos usando el parámetro files.

Ejemplo:

python
import requests

# Ruta del archivo a enviar
file_path = "example.pdf"  # Cambiar por la ruta de la imagen, audio, o archivo deseado

try:
  # Abrir el archivo en modo binario
  with open(file_path, "rb") as file:
      files = {"file": file}

      # Realizar la solicitud POST con el archivo adjunto
      response = requests.post("https://httpbin.org/post", files=files, timeout=10)
      response.raise_for_status()  # Lanza una excepción para errores HTTP

      # Procesar y mostrar la respuesta
      response_data = response.json()
      print("Archivo enviado exitosamente. Respuesta del servidor:")
      print(response_data)
except FileNotFoundError:
  print(f"Error: El archivo '{file_path}' no fue encontrado.")
except requests.exceptions.HTTPError as http_err:
  print(f"HTTP error occurred: {http_err}")
except requests.exceptions.RequestException as req_err:
  print(f"Request error occurred: {req_err}")
except Exception as e:
  print(f"Error inesperado: {e}")
  Explicación

  • with open: Asegura que el archivo se cierre automáticamente después de su uso.
  • Soporte para cualquier tipo de archivo: Solo cambia la ruta o nombre del archivo según lo que quieras enviar.
  • Manejo de errores:
    • Captura FileNotFoundError si el archivo no puede ser abierto.
    • Captura errores HTTP y de red con requests.
    • Captura otros errores con un bloque genérico.
  • timeout: Evita bloqueos prolongados si el servidor no responde.
  • Salida clara: Muestra la respuesta del servidor de manera estructurada.

Este enfoque es útil para enviar archivos binarios (imágenes, audios, PDFs, etc.) a un servidor. Solo ajusta la variable file_path con la ruta del archivo que deseas enviar.

Manejo de Errores

Usa try-except para manejar errores en solicitudes HTTP.

Ejemplo:

python
import requests

try:
  response = requests.get("https://jsonplaceholder.typicode.com/posts/1", timeout=5)
  response.raise_for_status()
  print(response.json())
except requests.exceptions.RequestException as e:
  print(f"Error: {e}")