Un nuevo post, dando seguimiento al anterior: Parte 4/6: CCNA Devnet 200-901:͇ 𝗜𝗻𝘁𝗿𝗼 𝗮 𝗣𝘆𝘁𝗵𝗼𝗻. Veremos un poco más a detalle sobre JSON, ya que en el examen hay preguntas exclusivamente relacionadas a comprender este formato. ¿Te gustaría poder utilizarlo a tu favor?, pues mantente en este post.
¿Qué es JSON?
Es una abreviación de JavaScript Object Notation. Es un formato ligero de intercambio de datos, con cualidades como:
- Fácil para los humanos leer y escribir.
- Fácil para las máquinas analizar y generar.
¿Genial no?
Que tal si vemos un ejemplo simbólico antes de continuar de donde dejamos el post anterior.
Digamos que quiero decir que tengo la información de algo… algo así como… el token o clave. Lo podríamos colocar así:
“token” : “123456789”
Este formato se le conoce como Data (Data), que se representa como nombre:valor o name:value separados por dos puntos (:).
¿Qué tal si quieres representar muchas Data? puedes hacerlo de esta manera:
{ ‘usuario’ : ‘Kevin’, “token” : “123456789” }
Este formato se le conoce como Objeto (Object) y puedes agruparlos con el símbolo llaves {}, separados por comas (,).
¿Qué tal si quieres representar muchos Objetos?, Se puede realizar de la siguiente manera:
Departamento: [
{ ‘usuario’ : ‘Kevin’, “token” : “123456789” },
{ ‘usuario’ : ‘Mario’, “token” : “abcdefghij” },
{ ‘usuario’ : ‘Goku’, “token” : “Dragon Ball” }
]
Este formato se le conoce como Arreglo (Array). Los mismos se agrupan con el símbolo corches [], separados por coma (,).
¿Recuerdas que mencionamos en el post anterior que en Python todo es un objeto?. Bueno, para guardar la información en una variable de formato JSON debes colocarlo dentro del símbolo de llaves {}.
Retomando post: Parte 4/5…
En el post anterior quedamos hasta la autenticación en la plataforma Cisco DNA Center. Solo como recordatorio, coloco el código anterior:
import requests
resp2 = requests.post("https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token",auth=('devnetuser', 'Cisco123!'), verify=False)
print(resp2.text)
¿Recuerdan que devolvía una respuesta que representa JSON?. Si, es cierto, solo que el detalle aquí es que la variable resp2.text devolvía un texto o String, lo cual no es manejable.
En este caso, hay 2 maneras de transformar la información en formato JSON.
Modo 1: Librería requests: función json()
La librería requests discutida en el post anterior, incluye la función json(). Si la respuesta HTTP o HTTPS detecta formato JSON, lo convertirá:
resp2.json()
Modo 2: Librería JSON.
Si tienes la información en modo String, pero sabes que dentro tiene una estructura JSON, puedes transformarlo con la opción json.loads()
import json
json.loads(resp2.text)
Probemos lo aprendido. Guardemos la información en una variable token.
Referencia API: Listado de equipos
Ya con el token guardado en una variable, es posible realizar consultas a la plataforma Cisco DNA Center. ¿Qué tal si preguntamos los equipos en la plataforma?
Bueno… ¿y como lo hago?. Necesitas conocer la referencia API de la plataforma. En nuestro caso se encuentra en el siguiente link:
https://developer.cisco.com/docs/dna-center/
GET:
/dna/intent/api/v1/network-device
Exploramos la referencia API y encontramos el API que devuelve los dispositivos de red en la plataforma (/dna/intent/api/v1/network-device).
Recordar que las referencias API solo te brinda la extensión requerida luego del host. Esto quiere decir que nos hace falta el host. En nuestro caso, la dirección es:
https://sandboxdnac.cisco.com
Listo, tenemos la url completa, pero debemos enviar el token en la petición GET de alguna forma… Busquemos nuevamente la referencia API:
X-Auth-Token
Si vamos al API de autenticación, nos indica que hay que colocar un header con el nombre X-Auth-Token y especificar el valor. Los valores de los headers se representan como Data, es decir de la forma X-Auth-Token: “VALOR_DEL_TOKEN”
En resumen, la información que necesitamos para realizar la consulta sería:
url= “https://sandboxdnac.cisco.com”
api=”/dna/intent/api/v1/network-device”
headers = {‘X-auth-token’ : token[‘Token’]}
Nota: Recordar que en Python todos son objetos, razón por la cual del formato de la variable headers.
url= "https://sandboxdnac.cisco.com"
api="/dna/intent/api/v1/network-device"
headers = {'X-auth-token' : token1['Token']}
response= requests.get(url + api,headers=headers,verify=False)
Nota: ¿Notaste que coloque la variable url y api como: url + api?
En Python puedes concatenar String de esa manera
Opcional: Analizando una estructura JSON de un equipo real
El resultado no es leíble, por lo menos en ese formato. Por suerte Atom tiene un complemento llamado Atom Beautify, que te permite “embellecer” data estructura y puedas leerla facilmente. Veamos como queda:
Nota: Atom Beautify es totalmente opcional, solo usado para fines explicativos.
Ya podemos leer la estructura JSON. Tomemos el primer elemento del arreglo para analizarlo:
{
"response": [{
"memorySize": "NA",
"family": "Routers",
"hostname": "asr1001-x",
"macAddress": "00:c8:8b:80:bb:00",
"serialNumber": "FXS1932Q1SE",
"inventoryStatusDetail": "<status><general code=\\"
SUCCESS\\ "/></status>",
"deviceSupportLevel": "Supported",
"collectionStatus": "Managed",
"apManagerInterfaceIp": "",
"tagCount": "0",
"tunnelUdpPort": null,
"waasDeviceMode": null,
"upTime": "50 days, 15:10:04.46",
"lastUpdateTime": 1602023920285,
"collectionInterval": "Global Default",
"softwareType": "IOS-XE",
"softwareVersion": "16.3.2",
"associatedWlcIp": "",
"bootDateTime": "2020-08-17 07:28:40",
"errorCode": null,
"errorDescription": null,
"interfaceCount": "0",
"lastUpdated": "2020-10-06 22:38:40",
"lineCardCount": "0",
"lineCardId": "",
"locationName": null,
"managementIpAddress": "10.10.22.253",
"platformId": "ASR1001-X",
"reachabilityFailureReason": "",
"reachabilityStatus": "Reachable",
"series": "Cisco ASR 1000 Series Aggregation Services Routers",
"snmpContact": "",
"snmpLocation": "",
"roleSource": "MANUAL",
"type": "Cisco ASR 1001-X Router",
"location": null,
"role": "CORE",
"instanceUuid": "1cfd383a-7265-47fb-96b3-f069191a0ed5",
"instanceTenantId": "5dc444d31485c5004c0fb20b",
"id": "1cfd383a-7265-47fb-96b3-f069191a0ed5"
}
...
}
Muestra toda la información de un equipo de red obtenido de la plataforma DNA Center.
Un dato importante, es que si usas la referencia API de este GET, verás que hay un modelo de ejemplo:
Es exactamente igual a la respuesta recibida, por lo que no necesitas tener acceso a la plataforma real para saber como la información viene estructurada.
Leyendo info JSON
Como último paso de este post es poder manipular la información recibida en Python.
Cuando tienes que leer un Arreglo (Array)puedes verlo bajo su posición numérica en el arreglo bajo corchetes [] de la siguiente forma:
response.json()[‘response’][0]
response.json()[‘response’][1]
response.json()[‘response’][2]
response.json()[‘response’][3]
Dentro de cada Objeto, está la Data, asi que es solo preguntar por el valor que se quiere obtener. Tenemos valores de ejemplo como ‘serialNumber’, ‘platformId’ o ‘series’, según lo que me indica la referencia API.
response.json()['response'][0]['serialNumber'] response.json()['response'][1]['softwareType'] response.json()['response'][2]['softwareVersion'] response.json()['response'][3]['serialNumber'] response.json()['response'][3]['platformId'] response.json()['response'][3]['series']
Búsqueda ciclica en Python: FOR
Un detalle, ¿No sería engorroso preguntar por cada objeto dentro de una variable uno a uno? Pues si… y mucho.
Por suerte en Python nos da la herramienta en bucle llamado for para que consulte la info hasta que ya no haya información. Su formato sería:
for VAR_ITERABLE in VAR_LISTA: #Cosas que harías con la variable VAR_ITERABLE
VAR_ITERABLE tendrá el valor VAR_LISTA[0], VAR_LISTA[1], VAR_LISTA[2] y así sucesivamente hasta que ya no haya información.
En ese caso podemos consultar todos los seriales de los equipos con solo 2 líneas de código:
for i in response.json()['response']:
print(i['serialNumber'])
Conclusiones
Con la comprensión de librerías como requests y json, así como también saber interpretar la información desde Python, te permite tener control de la data y generar automatizaciones con ella.
Bueno ha terminado este artículo. Espero que les haya dado una guía para comprender un poco sobre JSON orientado a la certificación CCNA DEVNET.
¿Dudas, opinión o sugerencias? Déjame tus comentarios.
Si te interesa alguno de nuestros servicios o leer todos nuestros posts, puedes localizarlos por esta red social o en mi portal SYNCORP. Gracias por la lectura.
Referencias
Formato JSON:
https://www.json.org/json-en.html
https://www.w3schools.com/js/js_json.asp
Cisco
https://developer.cisco.com/learning/modules/dnav3-intro-dnac
