PyLadiesMadrid / pycartociudad

Python package to query cartociudad API
GNU General Public License v3.0
2 stars 5 forks source link

Estandarizar gestión de errores en las llamadas a la API #10

Closed koldLight closed 4 years ago

koldLight commented 4 years ago

Todas las funciones llaman actualmente a la API y no se tratan de forma especial los errores.

Sería bueno estandarizar esto con dos objetivos:

Aquí una buena referencia para definirlo.

koldLight commented 4 years ago

Cosas que estoy viendo:

reverse geocode

La API devuelve 200 para peticiones correctas, 204 para peticiones sin resultados (ya sea porque no lo encuentra como si no vienen los parámetros en la petición).

P.e. estas dos combinaciones de params dan 204 (no content) y la respuesta, una cadena vacía.

url = "http://www.cartociudad.es/geocoder/api/geocoder/reverseGeocode"
params = {"lat": 0, "lon": 0}
# params = {}
r = requests.get(url=url, params=params)
(r.status_code, r.text)

Y devuelve 404 si los tipos de dato son incorrectos:

url = "http://www.cartociudad.es/geocoder/api/geocoder/reverseGeocode"
params = {"lat": "asdas", "lon": "dasdf"}
r = requests.get(url=url, params=params)
(r.status_code, r.text)

geocode

La API devuelve 200 aunque no encuentre la localización (o el parámetro de dirección venga vacío). Estos dos casos devuelven 200 y la respuesta, 'callback([])'.

full_address = urllib.parse.quote("jaksfnsdfkjandkqnjkdasnkjnakj")
# full_address = urllib.parse.quote("")
url = f'http://www.cartociudad.es/geocoder/api/geocoder/findJsonp?q={full_address}'
r = requests.get(url)
(r.status_code, r.text)

Pero da un 500 si no le metes el parámetro. En principio esto no nos afecta porque siempre se lo estamos pasando.

route

La API devuelve 200 aunque no encuentre la ruta, aunque pone un parámetro de found: false para indicarlo. P.e.

base_url = f'http://www.cartociudad.es/services/api/route'
lat_init, lon_init, lat_dest, lon_dest = (0, 0, 0, 0)
vehicle = True
request_url = f'{base_url}?orig={lat_init},{lon_init}&dest={lat_init},{lon_dest}' \
              f'&locale=es&vehicle={"CAR" if vehicle else "WALK"}'

r = requests.get(request_url)
(r.status_code, r.text)

Devuelve 500 si metes cosas raras:

base_url = f'http://www.cartociudad.es/services/api/route'
lat_init, lon_init, lat_dest, lon_dest = ("a", "b", "c", "d")
vehicle = True
request_url = f'{base_url}?orig={lat_init},{lon_init}&dest={lat_init},{lon_dest}' \
              f'&locale=es&vehicle={"CAR" if vehicle else "WALK"}'

r = requests.get(request_url)
(r.status_code, r.text)

Conclusiones

Cada petición gestiona de una forma los errores, no parece que la API siempre devuelva los mismos status_code para los mismos tipos de error...

Sí parece que en general peta (con 500) si, cuando espera numéricos, le pasas otra cosa diferente.

Mis propuestas son:

koldLight commented 4 years ago

Cierro esto, se quedan los comentarios de la issue como referencia, pero ya están creadas las tareas en otras issues