Solicitudes HTTP en Python con Requests

Publicado por Andrea Navarro en

En este artículo veremos como realizar solicitudes HTTP de manera sencilla y en pocas lineas de código haciendo uso de la librería Requests.

Requests es una librería HTTP para Python liberada bajo licencia Apache 2.0 que permite enviar solicitudes HTTP/1.1 de manera sencilla. Permite la decodificación automática de contenido como así también keep-alive y el conection pool. Las solicitudes pueden ser armadas de manera completamente dinámica y es posible configurar tiempos de espera.

Instalación de Requests

Requests puede ser instalada utilizando el manejador de paquetes pip.

python -m pip install requests

Request y Response

Cada vez que se quiere realizar una solicitud utilizando esta librería se está trabajando con dos objetos. Primero se está construyendo un objeto Request que contendrá la información requerida para realizar dicha solicitud, está será ejecutada contra un servidor. Una vez que la respuesta del servidor es recibida se generará un objeto Response, este contendrá toda la información enviada por el servidor y a su vez contendrá el objeto Request original.

Algunos de los atributos de la clase Request son:

  • method: Método de la solicitud (GET, OPTIONS, HEAD, POST, PUT, PATCH, o DELETE)
  • url: URL destino de la solicitud
  • params: Parámetros opcionales de la solicitud en formato diccionario, lista de tuplas o bytes
  • data: Datos opcionales de la solicitud en formato dicccionario, lista de tuplas, bytes u archivos
  • json: Datos opcionales de la solicitud en formato objeto JSON serializable de Python
  • headers: Cabeceras opcionales de la solicitud
  • timeout: Configuración opcional de tiempo de espera para la solicitud

El objeto Response por otro lado además de contener el objeto Request del cual es respuesta contiene entre otras cosas:

  • content: contenido de la respuesta en bytes
  • elapsed: tiempo entre la realización de la solicitud y la obtención de la respuesta
  • headers: diccionario de las cabeceras de la respuesta
  • status_code: código numérico de las respuesta HTTP (200, 404, 500, etc)

Solicitud sencilla con Requests

En el siguiente ejemplo se hace una solicitud a la API de Wikipedia para obtener los nombres de los primeros 5 artículos que contengan la palabra Python en formato JSON. En este caso solo debemos especificar la url de dicho endpoint en la API y realizar una solicitud utilizando el método GET.

import requests
r = requests.get('https://es.wikipedia.org/w/api.php?action=opensearch&search=Python&limit=5&namespace=0&format=json')

La variable r contendrá el objeto Response y será posible acceder a todos los atributos nombrados anteriormente. En el siguiente código podemos ver que el código HTTP es 200 indicando que la solicitud se ha completado exitosamente

r.status_code
//200

El contenido en este caso es un objeto JSON serializable .

r.content
***
b'["Python",["Python","Pythonidae","Python bivittatus","Python regius","Python brongersmai"],["","","","",""],["https://es.wikipedia.org/wiki/Python","https://es.wikipedia.org/wiki/Pythonidae","https://es.wikipedia.org/wiki/Python_bivittatus","https://es.wikipedia.org/wiki/Python_regius","https://es.wikipedia.org/wiki/Python_brongersmai"]]'
***

De manera similar podemos acceder a los datos de la solicitud realizada a partir del objeto Response. Aquí pueden apreciarle algunas de las configuraciones automáticas que se realizan sin necesidad de explicitarse en el código.

r.request.method
//'GET'
r.request.url
//'https://es.wikipedia.org/w/api.php?action=opensearch&search=Python&limit=5&namespace=0&format=json'
r.request.headers
//{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '<em>/</em>', 'Connection': 'keep-alive'}

Una manera más prolija de mandar esta solicitud colocando los parámetros por separado en la solicitud. Esto hace más sencillo el armado dinámico de solicitudes.

//Definir parámetros como diccionario
parametros = {'action': 'opensearch', 'search': 'Python', 'namespace':0, 'format' : 'json'}
//Definir url
url = 'https://es.wikipedia.org/w/api.php'
//Realizar la solicitud
r = requests.get(url, params = parametros)

Métodos

Es posible realizar solicitudes utilizando todos los tipos de métodos HTTP, en el caso que estos métodos requieran en el envío de datos, como es el caso de los métodos POST y PUT estos deben ser enviados en forma de diccionario de Python .

url= 'https://ejemplo.com/w/api.php'
data={'clave': 'valor'}
r = requests.post(url, data = data)
r = requests.put(url, data = data)
r = requests.delete(url)
r = requests.head(url)
r = requests.options(url)

Errores y exepciones

Requests generará diferentes tipos de excepciones dependiendo de los errores que surjan en la solicitud, todas estas heredaran de la clase requests.exceptions.RequestException. Se generará una excepción ConnectionError si existe un problema al intentar generar la conexión. Esta excepción puede ocurrir si hay un fallo en los DNS o se obtiene una respuesta de conexión rechazada.

Si el tiempo para la solicitud expirá Requests generará una excepción Timeout. Si la solicitud supera el número máximo de redirecciones configuradas generará la excepción TooManyRedirects.

El método Response.raise_for_status() generará un excepción HTTPError si la solicitud devuelve un código de status no exitoso.


En este artículo hemos visto como utilizar la librería Requests para realizar solicitudes HTTP en Python de manera sencilla y dinámica. Espero que les sea de utilidad!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora