3

La librería requests de python

En todos los lenguajes de programación modernos contamos con múltiples librerías que nos permiten hacer peticiones HTTP, FTP, etc. Pero por lo general, las librerías nativas de muchos de estos lenguajes tienen fines tan genéricos que se necesitan unas pocas líneas extras de código para conseguir nuestro fin específico. En el caso de python contamos con la librería nativa urllib2, la cual nos provee de múltiples métodos para obtener todo tipo de información de una url, además de utilidades para normalizar nuestros datos obtenidos, esta librería es sin duda muy útil, pero para un fin mas especifico que solo consumir urls al estilo de cURL, se me ocurre, para consumir un API RESTful, ¿cual es la mejor opción? La verdad es que para ese fin tan específico la mejor opción es sin duda utilizar la librería de terceros “requests”.

Para instalar requests basta solo con correr el comando:

pip install requests

Para probar la librería en nuestro programa solo hay que importarla:

import requests

Y ahora podemos comenzar a jugar con requests. Pero, ¿que nos brinda requests? Básicamente request es un wrapper de urllib2 junto con otros módulos de python para brindarnos de métodos sencillos con estructura REST, pues contamos con los métodos “post”, “get”, “put”, “patch”, “delete”, “head” y “options”, los cuales son todos los métodos necesarios para comunicarnos con un API RESTful sin problemas.

Python requests cuenta con una forma muy simple de implementación, pues un ejemplo de una consulta GET usando requests seria:

response = requests.get(“http://www.gooogle.com”)

Como podemos observar aquí, el método requests.get nos esta devolviendo un objeto llamada “response”; en este objeto se encuentra toda la información correspondiente a la respuesta de nuestra petición. De los atributos que posee response, vamos a fijarnos sólo en estos tres:

response.status_code: Este es el código HTTP devuelto por el servidor.

response.content: Aquí encontraremos el contenido en bruto de la respuesta del servidor.

response.json(): En el caso de que la respuesta sea un json, este método serializa el string y nos devolverá un “dict” con la estructura del json correspondiente, en caso de no recibir un json por respuesta, el método dispara una excepción.

Es importante conocer bien el comportamiento de la url a la que nos estamos conectando, saber qué respuestas esperar de esta, ya sea en caso de éxito o de error, y tratar ambos casos como es debido; por ejemplo aquí mostraré un pequeño fragmento de código que intenta obtener el resultado de una búsqueda con el API de youtube, en caso de que la respuesta sea exitosa, vamos a imprimir los títulos de cada resultado, en el caso contrario, un mensaje de error.

url = "https://gdata.youtube.com/feeds/api/videos?q=python&alt=json"
response = requests.get(url)

if response.status_code == 200:
   results = response.json()
   for result in results['feed']['entry']:
       print result['title']['$t']
else:
   print "Error code %s" % response.status_code

Para más detalles del funcionamiento del API de youtube consulte este link.

Los métodos post, put y patch requieren de un campo extra llamado “data”, en el cual enviamos un diccionario con todos los elementos que le mandaremos al servidor por medio del método correspondiente, un ejemplo simple seria este:

datos = {
   “nombre”: “Jesus Anaya”,
   “correo”: “jesus.anaya.dev@gmail.com”
}

url = “http://example.com/api/v1/alta_usuario”
response = requests.post(url, data=datos)

En algunos casos el servidor requiere que la petición contenga cabeceras indicando que nos estamos comunicando por json, para esos casos podemos modificar las cabeceras con el parámetro “headers”:

datos = {
   “nombre”: “Jesus Anaya”,
   “correo”: “jesus.anaya.dev@gmail.com”
}

cabeceras = {
   "Content-Type" : "application/json",
   "Accept":"application/json"
}

url = “http://example.com/api/v1/alta_usuario”
response = requests.post(url, data=datos, headers=cabeceras)

un último ejemplo que me gustaría mostrar es que podemos enviar cookies de una forma similar, el ejemplo lo explica mejor:

datos = {
   “nombre”: “Jesus Anaya”,
   “correo”: “jesus.anaya.dev@gmail.com”
}

cabeceras = {
   "Content-Type" : "application/json",
   "Accept":"application/json"
}

cookies = {
   “cookies_1”: “una cookie enviada”
}

url = “http://example.com/api/v1/alta_usuario”

response = requests.post(url, data=datos, headers=cabeceras, cookies=cookies)

Como podemos ver, request es una herramienta muy util si lo que queremos es consumir enp-points de API’s desde nuestra aplicación python, no olviden que es muy importante siempre leernos la documentación oficial de todas las herramientas con las que trabajamos, ya que es ahí donde se pueden resolver dudas mas especificas, para ver la documentacion de requests les dejo el link.

Espero que esta información les ayude con algún proyecto que tengan entre manos, para cualquier pregunta estare al pendiente de los comentarios.

Jesus Anaya - Programador de python y django con un gusto obsesivo por las series de television.

Comentarios

  1. avatar
    Maximiliano dijo

    Hola, como estas?, te hago una consulta, yo necesito que un arduino mande info a un sitio en python, mediante una api restfull, como seria en ese caso?

  2. avatar
    Hector de la Rosa M. dijo

    Buenos dias Jesus excelente aporte para alguien como yo que estoy comenzando con python me gustaria preguntarte como se utilizaria esta libreria en el caso de tener que logearme a algun sitio

  3. avatar
    santiago dijo

    buenas Jesús!! un articulo bastante explicativo, yo estoy haciendo una pequeña cosa en Python , leyendo unas entradas GPiOs de una Raspy3 y me gustaría saber si podría mandar esos "datos" que recojo en dos variables del programa a una url y poder esa url desde otro pc. Me han dicho que es usando el comando requests, pero ando buscando por la red y no encuentro nada que me lo deje claro. un saludo!

Pública un comentario