En este post vamos a ver como comenzar a consumir webservices en python 3, para esto vamos a consumir un webservices (ws) de clima, en este caso voy a usar la siguiente página.
para poder consumir, tienen que registrarse y crear una api para el consumo, son 60 peticiones diarias en la versión gratuita.
Consumir webservices en python – Método GET
Antes de comenzar, quiero recordar que existen 3 publicaciones antes de esta, si no sabes sobre python, dejare los links para que sepan que es y cómo dar los primeros pasos.
Consumir webservices
Para comenzar a consumir un webservices tenemos que importar las siguientes librerias
#!/usr/bin/env python3 import urllib.request import urllib.parse import http.client import json
Anteriormente existían 2 librerías para consumir datos en internet, pero para python se unificaron para crear/quedar la librería urllib.
Urllib: si entramos a la liga anterior, vamos a ver que existen 4 funciones
- request – Abre y lee peticiones url
- error – contiene los errores generados de request
- parse – herramienta para convertir url
- robotparse – convierte archivos robots.txt (google)
Http.client: esta librería no la usamos ya que la llamada por el momento se hace con urllib, pero es una interfaz más compleja.
Json: es una librería para crear, manipular y decodificar archivos/llamadas de tipo json
si vamos a la documentación de python 3 y entramos en urllib.request , vamos a ver todas las funciones que tiene esta clase.
la principal es urlopen que funciona de la siguiente manera
urllib.request.urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
¡Tranquilos! vamos a usar solo unos cuantos parámetros, en especial vamos a usar url y tiempo, el parámetro de objeto es el tiempo de espera en la petición, es decir que si la pagina tarda mas de lo que le indicamos, este dará un error.
si imprimimos la siguiente línea con una petición que nos regresará un json
print(urllib.request.urlopen(“http://unprogramador.com”,timeout=30))
vamos a ver un objeto como el siguiente
<http.client.HTTPResponse object at 0x03C4DC90>
para esto vamos a usar la función json de python 3
f = urllib.request.urlopen(url,timeout=30) djson = json.loads(f.read())
en la variable f guardamos el archivo que nos lanza el request, y usamos la función read() para poder leer el contenido, luego transformamos para que sea un lenguaje amigable.
la respuesta se vería de la siguiente manera, recordemos que en la url vamos a colocar la ruta de la api del clima
url = "http://api.openweathermap.org/data/2.5/weather?id=3995465&units=metric&APPID=152b1599f3e42d9d0f559bf3cf348a2b&lang=en" f = urllib.request.urlopen(url,timeout=30) djson = json.loads(f.read()) print(djson)
y la respuesta del json es la siguiente:
{‘coord’: {‘lon’: -100.32, ‘lat’: 25.67}, ‘weather’: [{‘id’: 721, ‘main’: ‘Haze’, ‘description’: ‘haze’, ‘icon’: ’50d’}], ‘base’: ‘stations’, ‘main’: {‘temp’: 25, ‘pressure’: 1012, ‘humidity’: 69, ‘temp_min’: 25, ‘temp_max’: 25}, ‘visibility’: 9656, ‘wind’: {‘speed’: 1, ‘deg’: 350}, ‘clouds’: {‘all’: 75}, ‘dt’: 1541004000, ‘sys’: {‘type’: 1, ‘id’: 4001, ‘message’: 0.0226, ‘country’: ‘MX’, ‘sunrise’: 1540990163, ‘sunset’: 1541030396}, ‘id’: 3995465, ‘name’: ‘Monterrey’, ‘cod’: 200}
Recordemos que python es un lenguaje multi-paradigma y todo lo que tenemos son objetos, cuando convertimos en json creamos un objeto con array, entonces si necesitamos consultar una variable se consulta como un arreglo
djson[‘coord’][‘lon’]
print(djson[‘weather’][0][‘main’])
Función Switch en python
Bueno en resumidas cuentas, si ustedes buscan nunca encontrarán algo como el switch tradicional, en python no existe como tal, pero podemos crear algo similar gracias a las bondades de las librerías/duplas/objetos.
def sw(x): clima = { 'Thunderstorm':'Tormenta', 'Clouds':'Nublado', 'Clear': 'Despejado', 'Haze': 'Niebla' } return clima.get(x,x)
nosotros podemos ir ingresando los valores que queremos traducir o usar como un switch, al igual que el switch, tenemos que escribir exactamente qué va a evaluar.
la línea que vemos en return lo que hace es que la primera x es el valor que se busca, y la segunda x es en caso de no encontrar la palabra que va a enviar, un ejemplo más práctico de leer sería así:
return clima.get(x,”no existe esta palabra”)
para finalizar pondré todo el código para que pueda compilarlo y ver cómo funciona cada cosa, recuerden que pueden dejar algun comentario para sugerencias, dudas u otra cosa!.
#!/usr/bin/env python3 import urllib.request import urllib.parse import http.client import json def sw(x): clima = { 'Thunderstorm':'Tormenta', 'Clouds':'Nublado', 'Clear': 'Despejado', 'Haze': 'Niebla', 'Mist':'niebla' } return clima.get(x,x) try: url = "http://api.openweathermap.org/data/2.5/weather?id=3995465&units=metric&APPID=152b1599f3e42d9d0f559bf3cf348a2b&lang=en" f = urllib.request.urlopen(url,timeout=30) djson = json.loads(f.read()) print(djson['coord']['lon']) print(sw(djson['weather'][0]['main'])) except: print('error al consultar datos')