4.1 Manejo de respuestas
El módulo requests ofrece métodos convenientes para trabajar con las respuestas del servidor.
Códigos de estado
Además de la respuesta, el servidor también envía un estado de procesamiento del request. La información sobre el estado se encuentra en los campos status_code y reason. Ejemplo a continuación:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Muestra el código de estado de la respuesta
print(response.reason) # Muestra la descripción textual del estado
print(response.ok) # Devuelve True si el código de estado es menor a 400
Encabezados
Y claro, ¿qué request HTTP sería sin encabezados? Si necesitas los encabezados del request o de la respuesta, puedes acceder a ellos a través del campo headers:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Muestra los encabezados de la respuesta
print(response.headers['Content-Type']) # Muestra el valor de un encabezado específico
Cuerpo de la respuesta
La respuesta del servidor puede contener un set de bytes, texto, json o xml. Si sabes exactamente qué estás solicitando al servidor, puedes obtener directamente un objeto del tipo deseado utilizando uno de los métodos/campos:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Muestra el cuerpo de la respuesta como texto
print(response.json()) # Muestra el cuerpo de la respuesta como JSON
print(response.content) # Muestra el cuerpo de la respuesta como bytes
Aprenderás más sobre los encabezados (headers) y los estados de respuesta en las lecciones sobre el funcionamiento de la red.
4.2 Manejo de errores
El módulo requests ofrece excepciones para manejar errores.
El estándar HTTP no implica excepciones, en su lugar trabaja con códigos de error (status_code). Si deseas que en resultado de un request fallido se genere una excepción de Python, necesitas llamar explícitamente a la función raise_for_status().
Ejemplo:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Genera una excepción para los códigos de estado 4xx y 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("¡Éxito!")
Puedes aprender más sobre los códigos de error en las lecciones sobre el funcionamiento de la red.
4.3 Envío de datos
Antes del invento de JSON, grandes volúmenes de datos se enviaban a través de un «formulario». Un formulario es un objeto especial en la página del navegador (y un estándar de datos en HTTP). Si deseas enviar datos a través de un «formulario», simplemente necesitas pasar el parámetro data junto con el request.
¡Importante! Los requests GET no soportan formularios, ya que no contienen cuerpo de request. Todos sus datos se pasan solo en el URL.
Envío de datos en un request GET
En un request GET los datos se pasan a través de parámetros del URL. Aquí un ejemplo:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Muestra el URL con los parámetros añadidos
Envío de datos de formulario
Usaremos un request POST para enviar datos al servidor.
Ejemplo:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Envío de archivos
Si quieres enviar datos binarios por internet, por ejemplo, subir una imagen, necesitas pasar tu archivo o archivos en el request utilizando el parámetro files.
Ejemplo:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Fácil como el abecé. Si quieres enviar varios archivos, enumeralos con cualquier nombre en la variable files.
¡Importante! No olvides cerrar el archivo después de enviarlo para evitar fugas de recursos. Es mejor usar la construcción with, que cierra automáticamente el archivo después de completar la operación:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Inicio de sesión y autorización
API (Application Programming Interface) es un conjunto de reglas y protocolos que permiten a diferentes programas interactuar entre sí. Muchos sitios y servicios permiten enviarles requests y trabajar con su API solo después de iniciar sesión.
Después de un inicio de sesión exitoso, recibes un objeto especial: una sesión (session), que contiene un número único de tu «sesión autorizada con el servidor». Para futuros requests, necesitas usar este objeto.
Autenticación
Para iniciar sesión en el servidor, necesitas pasar por la autenticación (proceso de iniciar sesión), para lo cual debes pasar las credenciales de usuario con el request.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
Así es como luce el proceso de autorización, pero usualmente se usa junto con una sesión.
Uso de sesiones
Las sesiones permiten mantener parámetros entre requests, como cookies o información de autorización del usuario.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Creación de una sesión
session = requests.Session()
# Inicio de sesión en el sitio
login_response = session.post('https://example.com/login', data = payload)
# Trabajo continuo bajo la sesión del usuario autenticado
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION