Peticiones a APIs REST usando python

Python

Python es uno de los lenguajes más populares en la actualidad, según el último Tiobe Index o la encuesta de lenguajes de programación de StackOverflow.

En la industria de las telecomunicaciones, también ha tomado mucha fuerza en los últimos años, principalmente, por lo sencillo que es aprenderlo y lo fácil de leer. Además, es un lenguaje muy versátil y con una amplia librería de paquetes que se pueden instalar para complementar lo que hacen los paquetes base del lenguaje.

La instalación de Python está fuera del alcance de este blog. Acá hay un vínculo de referencia que puede ser utilizado para eso: https://wiki.python.org/moin/BeginnersGuide/Download

APIs REST

En la industria de telecomunicaciones, así como en los ambientes de desarrollo, ha ido ganando fuerza que la integración con aplicaciones utilizando APIs REST, los cuales usan peticiones de HTTP aprovechando los métodos que soporta el estándar. Las cuatro opciones más comunes son:

  • GET: Obtiene información de un elemento.
  • POST: Crea un nuevo elemento.
  • PUT: Actualiza un elemento.
  • DELETE: Borra un elemento.

No obstante no son las únicas que se pueden utilizar. Por ejemplo, es factible usar PATCH como una manera de actualizar información sin sobreescribir todo el registro.

JSON

Los APIs REST soportan distintos formatos de datos, sin embargo, al igual que en los dos puntos anteriores, es JSON el formato que se ha ido posicionando como el principal en la industria, principalmente por lo liviano que es.

Librerías requests y json

Una de las librerías de Python más sencillas de utilizar para consultar APIs REST es requests la cual permite hacer peticiones mediante HTTP. Aunque es posible hacer las peticiones con otras librerías, requests facilita la interacción.

La librería json permite manipular el JSON que se obtiene del API y permite imprimirlo de una manera que sea más legible.

python
>>> import requests
>>> import json

Si alguna de las dos librerías da un error a la hora de importar, puede que sea necesario realizar la instalación de las mismas.

pip install requests
pip install json

Si estos comandos fallan, sugiero leer este enlace https://packaging.python.org/installing/.

Cisco Spark y autorización

Utilizaremos la librería para hacer peticiones al API REST de Cisco Spark. La cuenta de Cisco Spark es gratuita y permite hacer desarrollo sobre el API.

Es necesario que las solicitudes al API sean autenticadas con un token y enviado en los encabezados de la petición, en el campo de Authorization. El token puede ser obtenido en la página de desarrollador de Cisco Spark como se puede ver en la siguiente imagen:

Spark Token


GET: Obtener información

El método que se utiliza para obtener información es GET.

Con el token obtenido en el paso anterior, se debe cambiar en el siguiente código donde dice <TOKEN>. Con esto, podemos ejecutar el código que nos trae la información de nuestro usuario de Spark.

>>> token = "Bearer <TOKEN>"
>>> headers = {"Authorization": token}
>>> r = requests.get('https://api.ciscospark.com/v1/people/me', headers = headers)
>>> r.status_code
200
>>> json_body = r.json()
>>> print(json_body["nickName"])
Jose

POST: Crear un elemento

El método utilizado para crear un elemento es POST. En este caso, normalmente, debe enviarse en el cuerpo de la solicitud el objeto que defina el elemento que debe ser creado. En este caso vamos a crear un cuarto de Spark.

>>> body = {"title": "Prueba Blog Altus"}
>>> post = requests.post('https://api.ciscospark.com/v1/rooms', headers = headers, data = body)
>>> post.status_code
200
>>> json_post = post.json()
>>> print(json.dumps(json_post, indent=4, sort_keys=True))
{
    "created": "2017-04-13T00:10:08.147Z",
    "creatorId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS81MTMxNDE3Yy04ZDgyLTQxZmYtODZiOC1iZGE1ZjI4MTkyZDU",
    "id": "Y2lzY29zcGFyazovL3VzL1JPT00vOGQ5MWRlMzAtMWZkZC0xMWU3LTg5OTQtZGI4OGM3M2RkZjlk",
    "isLocked": false,
    "lastActivity": "2017-04-13T00:10:08.170Z",
    "title": "Prueba Blog Altus",
    "type": "group"
}
>>> print(json_post['title'])
Prueba Blog Altus

PUT: Actualizar información

Ahora utilizaremos PUT para actualizar la información del cuarto. Renombraremos el cuarto de Prueba Blog Altus a Prueba - Altus. En este caso, la llamada al API necesita que pasemos también la información de identificador del cuarto, por lo tanto crearemos la variable room_id y le agregaremos esa cadena de caracteres a la llamada del API https://api.ciscospark.com/v1/rooms/.

>>> body_put = {"title": "Prueba - Altus"}
>>> room_id = json_post['id']
>>> put = requests.put('https://api.ciscospark.com/v1/rooms/'+room_id, headers = headers, data = body_put)
>>> put.status_code
200
>>> json_put = put.json()
>>> print(json.dumps(json_put, indent=4, sort_keys=True))
{
    "created": "2017-04-13T00:10:08.147Z",
    "creatorId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS81MTMxNDE3Yy04ZDgyLTQxZmYtODZiOC1iZGE1ZjI4MTkyZDU",
    "id": "Y2lzY29zcGFyazovL3VzL1JPT00vOGQ5MWRlMzAtMWZkZC0xMWU3LTg5OTQtZGI4OGM3M2RkZjlk",
    "isLocked": false,
    "lastActivity": "2017-04-13T00:10:08.170Z",
    "title": "Prueba - Altus",
    "type": "group"
}
>>> print(json_put['title'])
Prueba - Altus

DELETE: Eliminar un elemento

Finalmente, utilizando DELETE podemos borrar un elemento. En este caso, como en el PUT es necesario pasar el identificador del cuarto que queremos eliminar.

>>> delete = requests.delete('https://api.ciscospark.com/v1/rooms/'+room_id, headers = headers)
>>> delete.status_code
204

Resumen

En este blog se ha visto el uso de las librerías requests y json para interactuar con el API de Cisco Spark. Se han realizado llamadas de GET, POST, PUT y DELETE para leer, crear, actualizar y borrar información.

En siguientes entradas del blog, seguiremos mostrando maneras de interactuar con tecnologías de Cisco y algunos otros lenguajes de programación como Javascript o Golang.