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}")