1.3.3.1 Parsing JSON With A Python Application
1.3.3.1 Parsing JSON With A Python Application
LABORATIRIO 1.3.3.1
NOMBRE: Jessica Calapaqui
FECHA: 02/Septiembre/2021
OBJETIVOS:
• Obtenga una clave de API de MapQuest.
• Importe los módulos necesarios.
• Cree variables de solicitud de API y construya una URL.
• Agregue la funcionalidad de entrada del usuario.
• Agregue una función de salida para que el usuario pueda finalizar la
aplicación.
• Muestra información del viaje para el tiempo, la distancia y el uso de
combustible.
• Itere a través de los datos JSON para extraer y generar las instrucciones.
• Muestra mensajes de error para entradas de usuario no válidas.
Su instructor puede demostrar la aplicación y mostrarle el guión que se utilizó para crearla. Además,
su instructor puede permitirle tener el script de solución, 08_parse-json_sol.py. Sin embargo,
creará este guión paso a paso en este laboratorio.
La aplicación solicita una ubicación de inicio y un destino. Luego solicita datos JSON de la API
MapQuest Directions, los analiza y muestra información útil.
Paso 2: Autenticar una solicitud RESTful.
Antes de crear la aplicación, deberá obtener una clave del sitio para desarrolladores de MapQuest,
lo que hará en el siguiente paso. Anteriormente, no usó autenticación para acceder a la API de
predicciones de ISS Pass. Sin embargo, muchas API requieren algún tipo de autenticación. La
autenticación de una solicitud RESTful se realiza de cuatro formas. Describe cada método a
continuación:
None:
Primero debes configurar el acceso a los recursos de tu API. Tu sistema API debe generar una
clave (key) y un secret key para cada cliente que requiera acceso a tus servicios. Cada vez que una
aplicación necesite consumir los datos de tu API, deberás enviar tanto la key como la secret key.
Este sistema es más seguro que los métodos anteriores, pero la generación de credenciales debe
ser manual y esto dificulta la escalabilidad de tu API. La automatización de generación e intercambio
de key’s es una de las razones principales por las que se desarrolló el método de autentificación
OAuth, que en el siguiente punto evaluaremos.
HTTP básico:
Esta es la forma más sencilla de asegurar tu API. Se basa principalmente en un nombre de usuario
y una contraseña para identificarte.
Para comunicar estas credenciales desde el cliente hasta el servidor, se debe realizar mediante
el encabezado HTTP Autorización (Authorization), según la especificación del protocolo HTTP.
Este método de autentificación está algo anticuado y puede ser un problema de seguridad en tu API
REST
Token:
En este método, el usuario se identifica al igual que con la autenticación básica, con sus
credenciales, nombre de usuario y contraseña. Pero en este caso, con la primera petición de
autentificación, el servidor generará un token basado en esas credenciales.
El servidor guarda en base de datos este registro y lo devuelve al usuario para que a partir de ese
momento no envíe más credenciales de inicio de sesión en cada petición HTTP. En lugar de las
credenciales, simplemente se debe enviar el token codificado en cada petición HTTP.
OAuth 2.0 es un método de autorización utilizado por compañías como Google, Facebook, Twitter,
Amazon, Microsoft, etc. Su propósito es permitir a otros proveedores, servicios o aplicaciones, el
acceso a la información sin facilitar directamente las credenciales de los usuarios. Pero tranquilo,
únicamente accederán bajo la confirmación del usuario, validando la información a la que se le
autorizara acceder.
6. Copia tu Clave del consumidor al Bloc de notas para uso futuro. Esta será la clave que
utilizará para el resto de este laboratorio.
Nota: MapQuest puede cambiar el proceso para obtener una clave. Si los pasos anteriores ya no
son válidos, busque "pasos para generar la clave de API de mapquest".
Paso 4: Importación de módulos para la aplicación.
Para comenzar su secuencia de comandos para analizar datos JSON, deberá importar dos módulos
de la biblioteca de Python: requests y urllib.parse. El módulo requests proporciona funciones para
recuperar datos JSON de una URL. El módulo urllib.parse proporciona una variedad de funciones
que le permitirán analizar y manipular los datos JSON que recibe de una solicitud a una URL.
key - la clave de API de MapQuest que recuperó del sitio web del desarrollador.
a. Cree variables para construir la URL que se enviará en la solicitud. Copie su clave
MapQuest en la variable clave.
main_api = "https://www.mapquestapi.com/directions/v2/route?"
orig = "Washington"
dest = "Baltimaore"
key = "your_api_key"
b. Combina las cuatro variables main_api, orig, dest, y key para formatear la URL solicitada.
Utilizar el urlencode método 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 (por ejemplo, espacio en "+" y una coma en "% 2C").
url = main_api + urllib.parse.urlencode({"key": key, "from":orig, "to":dest})
c. Cree una variable para contener la respuesta de la URL solicitada e imprima los datos JSON
devueltos. los json_data La variable contiene una representación de Diccionario de Python
de la respuesta json del método get del módulo requests. La declaración print se utiliza
para verificar los datos devueltos.
json_data = requests.get(url).json()
print(json_data)
Paso 6: prueba la solicitud de URL.
Ejecute su 08_json-parse1.py script y verifique que funcione. Solucione los problemas de su
código, si es necesario. Aunque su resultado puede ser ligeramente diferente, debería obtener una
respuesta JSON similar a la siguiente.
Más adelante en este lab, agregará elif y demás declaraciones para diferentes códigos de estado
valores.
b. Ampliar la ruta diccionario e investigar los datos enriquecidos. Hay valores para indicar si la
ruta tiene carreteras de peaje, puentes, túneles, carreteras, cierres o cruces hacia otros países.
También debería ver los valores para la distancia, el tiempo total que tomará el viaje y el uso
de combustible, como se resalta a continuación. Para analizar y mostrar esto, especifique el
ruta diccionario y seleccione el par clave / valor que desea imprimir.
if json_status == 0:
print("API Status: " + str(json_status) + " = A successful
route call.\n")
print("=============================================")
print("Directions from " + (orig) + " to " + (dest))
print("Trip Duration: " + (json_data["route"]["formattedTime"]))
print("Miles: " + str(json_data["route"]["distance"]))
print("Fuel Used (Gal): " + str(json_data["route"]["fuelUsed"]))
print("=============================================")
f. Correr 08_json-parse5.py para ver el siguiente resultado:
Starting Location: Washington
Destination: Baltimore
URL:
https://www.mapquestapi.com/directions/v2/route?to=Baltimore&key=Your_api_key&fro
m=Washington
API Status: 0 = A successful route call.
=============================================
Directions from Washington to Baltimore
Trip Duration: 00:49:19
Miles: 38.089
Fuel Used (Gal): 1.65
=============================================
Starting Location: q
g. MapQuest usa el sistema imperial y no hay un parámetro de solicitud para cambiar datos al
sistema métrico. Por lo tanto, probablemente debería convertir su aplicación para mostrar
valores métricos, como se muestra a continuación.
print("Kilometers: " + str((json_data["route"]["distance"])*1.61))
print("Fuel Used (Ltr): " + str((json_data["route"]["fuelUsed"])*3.78))
i. Utilizar el "{:. 2f} ". Formato argumento para formatear los valores flotantes a 2 lugares
decimales antes de convertirlos en valores de cadena, como se muestra a continuación. Cada
declaración debe estar en una línea.
print("Kilometers: " +
str("{:.2f}".format((json_data["route"]["distance"])*1.61)))
print("Fuel Used (Ltr): " +
str("{:.2f}".format((json_data["route"]["fuelUsed"])*3.78)))
Paso 14: Pruebe la funcionalidad de análisis y formato.
Ejecute su 08_json-parse5.py script para verificar que funciona. Solucione los problemas de su
código, si es necesario. Asegúrese de tener todos los paréntesis de apertura y cierre adecuados.
Debería obtener un resultado similar al siguiente.
Starting Location: Washington
Destination: Baltimore
URL:
https://www.mapquestapi.com/directions/v2/route?key=Your_api_key&to=Baltimore&fro
m=Washington
API Status: 0 = A successful route call.
=============================================
Directions from Washington to Baltimore
Trip Duration: 00:49:19
Kilometers: 61.32
Fuel Used (Ltr): 6.24
=============================================
Starting Location: q
Paso 16: agregue un bucle for para iterar a través de los datos JSON de
maniobras.
Complete los siguientes pasos para actualizar su aplicación:
Nota: La segunda instrucción de impresión de doble línea no tiene sangría dentro del bucle for. Por
lo tanto, es parte de la declaración if anterior que verifica la código de estado parámetro.
print("Fuel Used (Ltr): " +
str("{:.2f}".format((json_data["route"]["fuelUsed"])*3.78)))
print("=============================================")
for each in json_data["route"]["legs"][0]["maneuvers"]:
print((each["narrative"]) + " (" + str("{:.2f}".format((each["distance"])*1.61) +
" km)"))
print("=============================================\n")
Paso 17: Actividad: pruebe la iteración JSON.
Ejecute su 08_json-parse6.py script y verifique que funcione. Solucione los problemas de su
código, si es necesario. Debería obtener un resultado similar al siguiente:
Starting Location: Washington
Destination: Baltimore
URL:
https://www.mapquestapi.com/directions/v2/route?key=Your_api_key&to=Baltimore&fro
m=Washington
API Status: 0 = A successful route call.
Directions from Washington to Baltimore
Trip Duration: 00:49:19
Kilometers: 61.32
Fuel Used (Ltr): 6.24
=============================================
Start out going north on 6th St/US-50 E/US-1 N toward Pennsylvania Ave/US-1 Alt
N. (1.28 km)
Turn right onto New York Ave/US-50 E. Continue to follow US-50 E (Crossing into
Maryland). (7.51 km)
Take the Balt-Wash Parkway exit on the left toward Baltimore. (0.88 km)
Merge onto MD-295 N. (50.38 km)
Turn right onto W Pratt St. (0.86 km)
Turn left onto S Calvert St/MD-2. (0.43 km)
Welcome to BALTIMORE, MD. (0.00 km)
=============================================
Starting Location: q
Paso 18: Verifique la entrada de usuario no válida.
Ahora está listo para agregar una función final a su aplicación para informar un error cuando el
usuario ingresa datos no válidos. Recuerde que inició un bucle if para asegurarse de que el código
de estado es igual a 0 antes de analizar los datos JSON:
json_status = json_data["info"]["statuscode"]
if json_status == 0:
print("API Status: " + str(json_status) + " = A successful route call.\n")
a. Pero que pasa si el código de estado no es igual a 0? Por ejemplo, el usuario puede ingresar
una ubicación no válida o puede que no ingrese una o más 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ó.
Pruebe los siguientes valores en su aplicación. Debería ver resultados similares.
Starting Location: Washington
Destination: Beijing
URL:
https://www.mapquestapi.com/directions/v2/route?to=Beijing&key=your_api_key&from=
Washington
Starting Location: Washington
Destination: Balt
URL:
https://www.mapquestapi.com/directions/v2/route?to=Balt&key=your_api_key&from=Was
hington
Starting Location: Washington
Destination:
URL:
https://www.mapquestapi.com/directions/v2/route?to=&key=your_api_key&from=Washing
ton
Starting Location: q
b. Guarde su secuencia de comandos como 08_jsont-parse7.py.
c. Para proporcionar información de error cuando esto suceda, agregue elif y demás
declaraciones a su bucle if. Después de la última declaración de impresión de doble línea debajo
del si json_status == 0, agregue lo siguiente elif y demás declaraciones:
for each in json_data["route"]["legs"][0]["maneuvers"]:
print((each["narrative"]) + " (" +
str("{:.2f}".format((each["distance"])*1.61) + " km)"))
print("=============================================\n")
elif json_status == 402:
print("**********************************************")
print("Status Code: " + str(json_status) + "; Invalid user inputs for one or both
locations.")
print("**********************************************\n")
else:
print("************************************************************************")
print("For Staus Code: " + str(json_status) + "; Refer to:")
print("https://developer.mapquest.com/documentation/directions-api/status-codes")
print("************************************************************************\n
")
los elif la declaración se imprime si el código de estado el valor es 402 para una ubicación no
válida. los demás impresiones de declaraciones para todos los demás código de estado valores,
como sin entrada para una o más ubicaciones. La instrucción else finaliza el ciclo if / else y
devuelve la aplicación al ciclo while.
Paso 19: Actividad: pruebe la funcionalidad completa de la aplicación.
Ejecute su 08_json-parse7.py script y verifique que funcione. Solucione los problemas de su
código, si es necesario. Pruebe todas las funciones de la aplicación. Debería obtener un resultado
similar al siguiente:
Starting Location: Washington
Destination: Baltimore
URL:
https://www.mapquestapi.com/directions/v2/route?key=your_api_key&from=Washington&
to=Baltimore
API Status: 0 = A successful route call.
Directions from Washington to Baltimore
Trip Duration: 00:49:19
Kilometers: 61.32
Fuel Used (Ltr): 6.24
=============================================
Start out going north on 6th St/US-50 E/US-1 N toward Pennsylvania Ave/US-1 Alt
N. (1.28 km)
Turn right onto New York Ave/US-50 E. Continue to follow US-50 E (Crossing into
Maryland). (7.51 km)
Take the Balt-Wash Parkway exit on the left toward Baltimore. (0.88 km)
Merge onto MD-295 N. (50.38 km)
Turn right onto W Pratt St. (0.86 km)
Turn left onto S Calvert St/MD-2. (0.43 km)
Welcome to BALTIMORE, MD. (0.00 km)
=============================================
Starting Location: Moscow
Destination: Beijing
URL:
https://www.mapquestapi.com/directions/v2/route?key=your_api_key&from=Moscow&to=B
eijing
API Status: 0 = A successful route call.
Directions from Moscow to Beijing
Trip Duration: 84:31:10
Kilometers: 7826.83
Fuel Used (Ltr): 793.20
=============================================
Start out going west on Кремлёвская набережная/Kremlin Embankment. (0.37 km)
Turn slight right onto ramp. (0.15 km)
Turn slight right onto Боровицкая площадь. (0.23 km)
[output omitted]
Turn left onto 广场东侧路/E. Guangchang Rd. (0.82 km)
广场东侧路/E. Guangchang Rd becomes 东长安街/E. Chang'an Str. (0.19 km)
Welcome to BEIJING. (0.00 km)
=============================================
Starting Location: Washington
Destination: Beijing
URL:
https://www.mapquestapi.com/directions/v2/route?key=your_api_key&from=WashingtonT
urn+right+onto+%E5%89%8D%E9%97%A8%E8%A5%BF%E5%A4%A7%E8%A1%97%2FQianmen+West+Stree
t.+%281.01+km%29&to=Beijing
****************************************************************
Status Code: 402; Invalid user inputs for one or both locations.
****************************************************************
Starting Location: Washington
Destination: Balt
URL:
https://www.mapquestapi.com/directions/v2/route?key=your_api_key&from=Washington&
to=Balt
************************************************************************
Status Code: 602; Refer to:
https://developer.mapquest.com/documentation/directions-api/status-codes
Starting Location: Washington
Destination:
URL:
https://www.mapquestapi.com/directions/v2/route?key=your_api_key&from=Washington&
to=
************************************************************************
Status Code: 611; Refer to:
https://developer.mapquest.com/documentation/directions-api/status-codes
************************************************************************
Starting Location: q