Requests
Primeros pasos
Las peticiones HTTP (HTTP requests en inglés) son mensajes enviados por un cliente a un servidor para solicitar datos o realizar alguna acción. El protocolo HTTP (HyperText Transfer Protocol) es el protocolo de comunicación que se utiliza para transferir datos en la web. Es el medio por el cual los navegadores web y otros clientes se comunican con los servidores web.
Una petición HTTP consta de varias partes:
-
Línea de petición: La línea de petición especifica el método HTTP que se va a usar (como
GET
,POST
,PUT
,DELETE
, etc.), la URL del recurso que se solicita y la versión de HTTP que se está utilizando (por ejemplo,HTTP/1.1
).Ejemplo de línea de petición:
GET /path/recurso HTTP/1.1
-
Cabeceras: Las cabeceras HTTP contienen información sobre la petición, como el tipo de contenido que se está enviando, el tipo de contenido que se espera recibir, las cookies, los datos de autenticación, entre otros. Las cabeceras se envían como líneas separadas por dos puntos (
:
).Ejemplo de una cabecera:
Host: www.example.com
-
Cuerpo: En algunos tipos de peticiones, como
POST
oPUT
, se puede incluir un cuerpo con datos adicionales que se envían al servidor. Por ejemplo, en una solicitudPOST
de un formulario, el cuerpo puede contener los datos del formulario.
Los métodos HTTP más comunes son:
- GET: Solicita un recurso del servidor.
- POST: Envía datos al servidor para su procesamiento (por ejemplo, al enviar un formulario).
- PUT: Actualiza un recurso existente en el servidor.
- DELETE: Elimina un recurso del servidor.
- HEAD: Similar a
GET
, pero solo solicita las cabeceras del recurso. - OPTIONS: Solicita información sobre las opciones de comunicación disponibles con el servidor.
- PATCH: Similar a
PUT
, pero solo actualiza parte de un recurso.
En resumen, las peticiones HTTP son mensajes que permiten a un cliente interactuar con un servidor en la web, ya sea solicitando recursos o enviando datos para su procesamiento.
Biblioteca requests
La biblioteca requests
es una popular librería de Python que simplifica el envío de solicitudes HTTP (GET, POST, PUT, DELETE, etc.) y facilita el manejo de respuestas HTTP. Se utiliza ampliamente para interactuar con servidores web y APIs (interfaces de programación de aplicaciones). Ofrece una interfaz amigable y de alto nivel para trabajar con HTTP, brindando funciones para enviar solicitudes, gestionar respuestas y manipular sesiones HTTP.
A continuación, te explico las características clave de la biblioteca requests
y cómo usarla para realizar diferentes tipos de peticiones HTTP:
Instalación
Puedes instalar la biblioteca requests
usando pip
:
pip install requests
Usar requests
para realizar peticiones
Para utilizar requests
, primero debes importarla:
import requests
Peticiones básicas
Puedes realizar diferentes tipos de peticiones HTTP usando los métodos correspondientes de la biblioteca requests
:
-
GET: Para realizar una solicitud HTTP GET:
response = requests.get('https://api.example.com/data')
-
POST: Para realizar una solicitud HTTP POST con datos:
data = {'key': 'value'}
response = requests.post('https://api.example.com/data', json=data) -
PUT: Para realizar una solicitud HTTP PUT para actualizar un recurso:
data = {'key': 'value'}
response = requests.put('https://api.example.com/data/1', json=data) -
DELETE: Para realizar una solicitud HTTP DELETE para eliminar un recurso:
response = requests.delete('https://api.example.com/data/1')
Manejo de respuestas
Cuando realizas una solicitud, requests
devuelve un objeto Response
que contiene la respuesta del servidor. Puedes acceder a varios atributos:
response.status_code
: El código de estado HTTP (por ejemplo,200
para OK,404
para no encontrado).response.text
: El contenido de la respuesta como una cadena de texto.response.json()
: Convierte la respuesta JSON a un diccionario de Python (si el contenido es JSON).response.headers
: Un diccionario con las cabeceras de la respuesta.
Ejemplo:
response = requests.get('https://api.example.com/data')
print(response.status_code)
print(response.text)
print(response.headers)
Enviar cabeceras personalizadas
Puedes agregar cabeceras personalizadas a una solicitud usando el parámetro headers
:
headers = {
'Authorization': 'Bearer token',
'Content-Type': 'application/json',
}
response = requests.get('https://api.example.com/data', headers=headers)
Manejo de sesiones
Puedes crear una sesión para mantener cierta persistencia en tus solicitudes, como mantener cookies o autenticación entre diferentes solicitudes:
session = requests.Session()
session.headers.update({'Authorization': 'Bearer token'})
response = session.get('https://api.example.com/data')
Envío de archivos
Puedes enviar archivos como parte de una solicitud POST usando el parámetro files
:
files = {'file': open('path/a/archivo.txt', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
Responses
Los objetos de respuesta (Response
) de la biblioteca requests
contienen información importante sobre la respuesta recibida del servidor después de enviar una solicitud HTTP. Estos objetos proporcionan una serie de atributos y métodos que permiten acceder a diferentes aspectos de la respuesta. Aquí tienes información detallada sobre algunos de los aspectos más importantes de los objetos Response
de requests
:
Atributos Principales:
-
status_code
: Este atributo contiene el código de estado HTTP de la respuesta. Los códigos de estado comunes incluyen200
para OK,404
para no encontrado y500
para error interno del servidor. -
headers
: Un diccionario que contiene las cabeceras de la respuesta HTTP. Puedes acceder a cabeceras específicas utilizando la sintaxis de diccionario (response.headers['header_name']
). -
text
: El contenido de la respuesta como una cadena de texto. Esto generalmente contiene datos de texto sin procesar, como HTML, JSON, XML, etc. -
content
: El contenido de la respuesta en formato binario. Puedes usar este atributo si necesitas acceder al contenido sin procesar de la respuesta, como imágenes o archivos binarios. -
json()
: Un método que convierte automáticamente el contenido de la respuesta en un objeto de Python (generalmente un diccionario) si la respuesta está en formato JSON. Esto es útil para manejar respuestas JSON de APIs.
Métodos Útiles:
-
raise_for_status()
: Un método que genera una excepción si la solicitud no se completó correctamente (por ejemplo, si el código de estado es un error 4xx o 5xx). Es útil para manejar errores de manera explícita. -
iter_content(chunk_size=1, decode_unicode=False)
: Un generador que lee el contenido de la respuesta en fragmentos de tamañochunk_size
. Esto es útil para manejar grandes respuestas de manera eficiente. -
close()
: Un método que cierra la conexión de red utilizada para enviar la solicitud y recibir la respuesta. Es importante cerrar explícitamente la conexión después de usarla para liberar recursos.
Ejemplo de Uso:
import requests
# Realizar una solicitud GET
response = requests.get('https://api.example.com/data')
# Acceder a los atributos de la respuesta
print(response.status_code)
print(response.headers)
print(response.text)
# Convertir la respuesta JSON a un diccionario de Python
data = response.json()
# Verificar si la solicitud fue exitosa
response.raise_for_status()
# Cerrar la conexión
response.close()
Estos son solo algunos de los atributos y métodos más comunes disponibles en los objetos de respuesta de requests
. Puedes consultar la documentación oficial de requests
para obtener más información sobre todas las funcionalidades disponibles.
Status codes
Esta es una lista de los códigos de estado HTTP agrupados por su significado general:
Éxito (2xx):
-
200 OK: La solicitud ha tenido éxito.
-
201 Created: La solicitud ha sido completada y ha resultado en la creación de un nuevo recurso.
-
204 No Content: La solicitud se ha completado con éxito pero no hay contenido para enviar en la respuesta.
Redirección (3xx):
-
301 Moved Permanently: La página solicitada ha sido trasladada permanentemente a una nueva URL.
-
302 Found (or Moved Temporarily): La página solicitada ha sido trasladada temporalmente a una nueva URL.
-
304 Not Modified: Indica que el recurso no ha sido modificado desde la última solicitud. Usado en respuestas a solicitudes condicionales.
Error del Cliente (4xx):
-
400 Bad Request: La solicitud contiene sintaxis incorrecta o no puede ser procesada.
-
401 Unauthorized: El cliente debe autenticarse para obtener la respuesta solicitada.
-
403 Forbidden: El servidor se niega a cumplir la solicitud, generalmente debido a permisos insuficientes.
-
404 Not Found: El recurso solicitado no se encuentra en el servidor.
Error del Servidor (5xx):
-
500 Internal Server Error: El servidor encontró una condición inesperada que impidió que completara la solicitud.
-
502 Bad Gateway: El servidor, actuando como una puerta de enlace o proxy, recibió una respuesta no válida del servidor ascendente.
-
503 Service Unavailable: El servidor no puede manejar la solicitud en este momento debido a una sobrecarga temporal o mantenimiento del servidor.
Información (1xx):
-
100 Continue: Indica que el cliente puede continuar con su solicitud.
-
101 Switching Protocols: Indica que el servidor está cambiando los protocolos utilizados en la conexión.
-
102 Processing: Indica que el servidor ha recibido y está procesando la solicitud, pero aún no ha completado la acción requerida.
Otros (códigos no estándar):
-
418 I'm a teapot: Indica que el servidor se niega a preparar café porque es un "súper servidor".
-
451 Unavailable For Legal Reasons: Indica que el acceso al recurso está bloqueado por razones legales.
Estos son algunos de los códigos de estado HTTP más comunes y sus significados generales. Es importante tener en cuenta que hay muchos más códigos de estado HTTP definidos en las especificaciones del protocolo HTTP.