Solicitudes HTTP en Python con Requests
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
, oDELETE
)url
: URL destino de la solicitudparams
: Parámetros opcionales de la solicitud en formato diccionario, lista de tuplas o bytesdata
: Datos opcionales de la solicitud en formato dicccionario, lista de tuplas, bytes u archivosjson
: Datos opcionales de la solicitud en formato objeto JSON serializable de Pythonheaders
: Cabeceras opcionales de la solicitudtimeout
: 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 byteselapsed
: tiempo entre la realización de la solicitud y la obtención de la respuestaheaders
: diccionario de las cabeceras de la respuestastatus_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!