4.9.2 Lab Integrate A Rest API in A Python Application Es XL
4.9.2 Lab Integrate A Rest API in A Python Application Es XL
Objetivos
Parte 1: Iniciar la máquina virtual de DEVASC.
Parte 2: Demostrar la Aplicación de Direcciones de MapQuest
Parte 3: Obtener una clave API de MapQuest
Parte 4: Crear la aplicación de Dirección Básica de MapQuest
Parte 5: Actualizar la Aplicación de Dirección de MapQuest con más características
Parte 6: Probar la funcionalidad completa de la aplicación
Aspectos básicos/Situación
En este laboratorio, creará una aplicación en Visual Studio Code (VS Code) que recupera datos JSON de la
API de Direcciones de MapQuest, analiza los datos y les da formato para la salida al usuario. Utilizará la
solicitud GET Route de la API de direcciones de MapQuest. Revise la documentación de GET Route
Directions API aquí:
https://developer.mapquest.com/documentation/directions-api/route/get/
Nota: Si el enlace anterior ya no funciona, busque por “Documentación de la API de MapQuest”.
Recursos necesarios
• Una computadora con el sistema operativo de su elección.
• VirtualBox o VMware.
• Máquina virtual (Virtual Machine) DEVASC.
Instrucciones
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 1 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
Nota: Para ver el JSON para la salida anterior, puede copiar la URL en una pestaña del navegador. Sin
embargo, deberá reemplazar your_api_key por la clave API de MapQuest que obtenga en la Parte 3.
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 2 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
b. Seleccione Terminal > New Terminal para abrir una Terminal dentro del VS Code.
c. Guardar y ejectuar el script. No debería recibir errores. Debe guardar y ejecutar los scripts a menudo
para probar la funcionalidad del código.
devasc @labvm: ~/labs/devnet-src/mapquest$ python3 mapquest_parse-json_1.py
devasc @labvm: ~/labs/devnet-src/mapquest$
b. Combine las cuatro variables main_api, orig, desty key para dar formato a la URL solicitada. Utilice el
método urlencode para formatear correctamente el valor de la dirección. Esta función construye la parte
de parámetros de la URL y convierte posibles caracteres especiales en el valor de la dirección en
caracteres aceptables (por ejemplo, espacio en “+” y una coma en “%2C”).
url = main_api + urllib.parse.urlencode ({“key” :key, “from” :orig, “to” :dest})
c. Crear una variable para contener la respuesta de la URL solicitada e imprimir los datos JSON devueltos.
La variable json_data contiene una representación del diccionario de Python de la respuesta json del
método get del módulo de peticiones. El requests.get realizará la llamada API a la API de MapQuest.
La declaración de print se utilizará temporalmente para comprobar los datos devueltos. Reemplazará
esta declaración de impresión con opciones de visualización más sofisticadas más adelante en el
laboratorio.
json_data = requests.get (url) .json ()
print (json_data)
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 3 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
d. Su código final deberá verse así, pero con un valor diferente para la clave.
import urllib.parse
solicitudes de importación
main_api = “https://www.mapquestapi.com/directions/v2/route?”
orig = “Washington, D.C.”
dest = “Baltimore, Md”
key = “FzadaFoy22VieeeEMZCBFFXL5VJSXIPPZ” #Replace con la clave de MapQuest
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 4 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
c. Cambie las variables orig y dest. Vuelva a ejecutar el script para obtener resultados diferentes. Para
garantizar los resultados que desea, lo mejor es incluir tanto la ciudad como el estado para las ciudades
de los Estados Unidos. Al referirse a ciudades de otros países, normalmente puede usar el nombre en
inglés de la ciudad y el país o el nombre nativo. Por ejemplo:
orig = “Roma, Italia”
dest = “Frascati, Italia”
o
orig = “Roma, Italia”
dest = “Frascati, Italia”
json_data = requests.get(url).json()
json_status = json_data [“info”] [“statuscode”]
if json_status == 0:
print(“API Status: “ + str(json_status) + “ = A successful route call.\n”)
devasc@labvm:~/labs/devnet-src/mapquest$
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 5 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
main_api = “https://www.mapquestapi.com/directions/v2/route?”
key = “fZadaFOY22VIEEemZcBFfxl5vjSXIPpZ”
while True:
orig = input(“Starting Location: “)
dest = input(“Destination: “)
url = main_api + urllib.parse.urlencode({“key”: key, “from”:orig, “to”:dest})
print(“URL: “ + (url))
json_data = requests.get(url).json()
json_status = json_data [“info”] [“statuscode”]
if json_status == 0:
print (“API Status:” + str (json_status) + “= Una llamada de ruta exitosa.\ n”)
devasc@labvm:~/labs/devnet-src/mapquest$
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 6 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 7 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
Verá que hay dos diccionarios root: rout e info. Observe que la información tiene la clave/valor de
código de estado emparejado utilizada en su código.
{
+ ruta: {},
- info: {
código de estado: 0,
- derechos de autor: {
ImageAltText: “© 2019 MapQuest, Inc.”,
ImageURL: “http://api.mqcdn.com/res/mqlogo.gif “,
text: “© 2019 MapQuest, Inc.”
},
mensajes: [ ]
}
}
d. Expanda el diccionario de ruta (haga clic en el signo más “+” antes de la route) e investigue los datos
enriquecidos. Hay valores que indican si la ruta tiene carreteras de peaje, puentes, túneles, autopistas,
cierres o cruces hacia otros países. También deberías ver los valores de distancia, el tiempo total que
tardará el viaje y el consumo de combustible. Para analizar y mostrar estos datos en su aplicación, debe
especificar el diccionario de route y, a continuación, seleccionar el par key/value que desea imprimir.
Hará un análisis del diccionario de ruta en la siguiente parte del laboratorio.
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 8 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
=============================================
Cómo llegar desde Washington, D.C. a Baltimore, Md
Duración del viaje: 00:49:29
Millas: 38.089
Combustible utilizado (Gal): 1.65
=============================================
Localización Inicial: q
devasc@labvm:~/labs/devnet-src/mapquest$
d. Por defecto, MapQuest utiliza el sistema imperial y no hay un parámetro de solicitud para cambiar los
datos al sistema métrico. Por lo tanto, probablemente debería convertir su aplicación para mostrar los
valores de métrica, como se muestra a continuación.
print(“Kilometers: “ + str((json_data[“route”][“distance”])*1.61))
print (“Combustible usado (Ltr):” + str ((json_data [“route”] [“FuelUsed”])*3.78))
=============================================
Direcciones desde Washington, D.C. a Baltimore, Md
Duración del viaje: 00:49:29
Kilómetros: 61.32329
Combustible utilizado (Ltr): 6.2369999999999
=============================================
Localización Inicial: q
devasc@labvm:~/labs/devnet-src/mapquest$
f. Las posiciones decimales adicionales para Kilómetros y Combustible Usado no son útiles. Utilice el
argumento de formato “{: .2f}”. Para formatear los valores flotantes a 2 lugares decimales antes de
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 9 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
convertirlos en valores de cadena, como se muestra a continuación. Cada declaración debe estar en una
línea.
print (“Kilómetros:” + str (“{:.2f}” .format((json_data [“route”] [“distance”])
*1.61)))
print (“Combustible usado (Ltr):” + str (“{:.2f}” .format((json_data [“route”]
[“FuelUsed”]) *3.78)))
=============================================
Direcciones desde Washington, D.C. a Baltimore, Md
Duración del viaje: 00:49:29
Kilómetros: 61.32
Combustible utilizado (Ltr): 6.24
=============================================
Localización Inicial: q
devasc@labvm:~/labs/devnet-src/mapquest$
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 10 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
OriginDeX: -1,
hasAccessRestriction: false,
hasSeasonalClosure: false,
HasCountryCross: false,
- Estrategia RoadGradeStrategy: [
[ ]
],
DestinDeX: 3,
tiempo: 2969,
hasUnpavimentado: false,
Orignarrative: ““,
- maneuvers: [
+ {…},
+ {…},
+ {…},
+ {…},
+ {…},
+ {…},
+ {…}
],
HasFerry: false
}
],
- options: {
c. Expanda el primer diccionario de la lista de maniobras. Cada diccionario contiene una clave narrativa
con un valor, como “Empezar hacia el norte...”, como se muestra a continuación. Debe analizar los datos
JSON para extraer el valor para que la clave narrativa se muestre dentro de su aplicación.
- instrucciones: [
- {
HastollRoad: false,
hasBridge: true,
“ Proceder a BALTIMORE, MD.”,
distance: 38.089,
hasTimedRestriction: false,
HaStunnel: false,
HasHighway: true,
index: 0,
FormatedTime: “00:49:29”,
OriginDeX: -1,
hasAccessRestriction: false,
hasSeasonalClosure: false,
HasCountryCross: false,
- roadGradeStrategy: [
[ ]
],
DestinDeX: 3,
time: 2969,
hasUnpavimentado: false,
Orignarrative: ““,
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 11 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
- maneuvers: [
- {
distance: 0.792,
- streets: [
“6º St”,
“US-50 E”,
“US-1 N”
],
narrativa: “Comienza hacia el norte por la 6ª ST/US-50E/US-1 N hacia Pennsylvania
Ave/US-1 Alt N.”,
TurnType: 0,
- StartPoint: {
lng: -77.019913,
lat: 38.892063
},
índex: 0,
FormatedTime: “00:02:06”,
DirectionName: “Norte”,
Notas de maniobra: [],
LinKids: [],
- signs: [
- {
ExtraText: ““,
ext: “50”,
type: 2,
<output omitted>
Paso 4: Agregue un bucle for para iterar a través de los datos JSON maniobras.
Complete los siguientes pasos para actualizar la aplicación y mostrar el valor de la clave narrativa. Lo hará
creando un bucle for para iterar a través de la lista de maniobras, mostrando el valor narrativo de cada
maniobra desde la ubicación inicial hasta el destino.
a. Guarde su script como mapquest_parse-json_6.py.
b. Agregue un bucle “for”, resaltado a continuación, después de la segunda declaración de impresión de
doble línea. El bucle for itera a través de cada lista de maniobras y hace lo siguiente:
1) Imprima el valor narrativo.
2) Convierta las millas en kilómetros con *1.61.
3) Formatea el valor del kilómetro para imprimir sólo dos posiciones decimales con la función “{:.2f}”
.format.
c. Agregue una instrucción de impresión que mostrará una línea doble antes de que la aplicación solicite
otra ubicación inicial, como se muestra a continuación.
Nota: La sentencia de impresión de línea doble no está sangrada dentro del bucle for. Por lo
tanto, es parte de la instrucción if anterior que comprueba el parámetro statuscode.
print (“Combustible usado (Ltr):” + str (“{:.2f}” .format ((json_data [“route”]
[“FuelUsed”]) *3.78)))
print(“=============================================“)
para cada uno en json_data [“ruta”] [“piernas”] [0] [“maniobras”]:
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 12 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
print (((each [“narrative”]) + “(“ + str (“{:.2f}” .format (((each [“distancia”]) *1.61) +
“km)”))
print (“=====================================================\ n”)
=============================================
Direcciones desde Washington, D.C. a Baltimore, Md
Duración del viaje: 00:49:29
Kilómetros: 61.32
Combustible utilizado (Litosr): 6.24
=============================================
Salga hacia el norte por la 6ª ST/US-50 E/US-1 N hacia Pennsylvania Ave/US-1 Alt N.
(1,28 km)
Gire a la derecha en New York Ave/US-50 E. Y continúe por US-50 E (cruce hacia
Maryland). (7.51 km)
Tome la salida Balt-Wash Parkway a la izquierda hacia Baltimore. (0.88 km)
Incorpórese en MD-295 N. (50.38 km)
Gire a la derecha hacia W Pratt St. (0,86 km)
Gire a la izquierda hacia S Calvert ST/MD-2. (0.43 km)
Bienvenido a BALTIMORE, MD. (0.00 km)
=============================================
Ubicación de inicio: q
devasc@labvm:~/labs/devnet-src/mapquest$
if json_status == 0:
print (“API Status:” + str (json_status) + “= Una llamada de ruta exitosa.\
n”)
Pero, ¿qué sucede si el código de estado no es igual a 0? Por ejemplo, es posible que el usuario introduzca
una ubicación no válida o que no especifique una o varias ubicaciones. Si es así, la aplicación muestra la
URL y solicita una nueva ubicación de inicio. El usuario no tiene idea de lo que pasó.
a. Para hacer que la aplicación falle sin notificación del usuario, pruebe los siguientes valores en la
aplicación. Deberías ver resultados similares.
devasc@labvm:~/labs/devnet-src/mapquest$ python3 mapquest_parse-json_6.py
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 13 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
La primera instrucción elif se imprime si el valor de código de estado es 402 para una ubicación no
válida. La segunda instrucción elif se imprime si el valor de código de estado es 611 porque el usuario
no proporcionó una entrada para una o ambas ubicaciones. La instrucción else se imprime para todos
los demás valores de código de estado, como cuando el sitio de MapQuest devuelve un error. La
sentencia else termina el bucle if/else y devuelve la aplicación al bucle while.
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 14 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
=============================================
Direcciones desde Washington, D.C. a Baltimore, Md
Duración del viaje: 00:49:29
Kilómetros: 61.32
Combustible utilizado (Litosr): 6.24
=============================================
Salga hacia el norte por la 6ª ST/US-50 E/US-1 N hacia Pennsylvania Ave/US-1 Alt N.
(1,28 km)
Gire a la derecha en New York Ave/US-50 E. Y continúe por US-50 E (cruce hacia
Maryland). (7.51 km)
Tome la salida Balt-Wash Parkway a la izquierda hacia Baltimore. (0.88 km)
Incorpórese en MD-295 N. (50.38 km)
Gire a la derecha hacia W Pratt St. (0,86 km)
Gire a la izquierda hacia S Calvert ST/MD-2. (0.43 km)
Bienvenido a BALTIMORE, MD. (0.00 km)
=============================================
=============================================
Cómo llegar desde Moscú, Rusia a Pekín, China
Duración del viaje: 84:31:10
Kilómetros: 7826,83
Combustible utilizado (Ltr): 793.20
=============================================
Comienza hacia el oeste por Кремлёвская Набережная/terraplén del Kremlin. (0.37 km)
Gire ligeramente a la derecha en la rampa. (0.15 km)
Gire ligeramente a la derecha hacia Боровицкая площадь. (0.23 km)
<output omitted>
Gire ligeramente a laizquierda hacia la calle/Qianmen East Street. (0.31 km)
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 15 de 16
www.netacad.com
Laboratorio - Integrar una API REST en una aplicación Python
© 2020 - aa Cisco y/o sus filiales. Todos los derechos reservados. Información pública de Cisco Página 16 de 16
www.netacad.com