Usando APIs (I)

Introducción

Son muchas las apps que usamos a diario que emplean APIs (propias o de terceros) para suministrarse de los datos que precisan. Pensemos, por ejemplo, en los clientes de twitter, facebook y otras redes sociales. Dichas redes – aplicaciones web – tienen una serie de scripts “no visibles” que sirven datos a quienes les suministran los parámetros adecuados. Esos scripts son sus API, su forma de permitir a aplicaciones diferentes de los navegadores de internet que tengan acceso a sus datos.

Dichas API pueden ser públicas (cualquiera puede acceder a ellas y usarlas en sus propios desarrollos, aunque no pertenezca a esa empresa) o privadas (como la de Tuenti, que sólo la emplean ellos). Dichas API pueden tener limitación de uso (la de twitter no permite enviar mas de X tweets en un determinado número de horas) o no tenerlo; y pueden exigir que identifiques la app que va a hacer uso de sus datos con un APIKEY, una cadena alfanumérica única que está asociada a la app para la que la registraste.

Dos funcionalidades bastante útiles para muchas apps son convertir unas coordenadas – como las que nos proporciona el gps del móvil – en una dirección de texto y acortar una url larga. Google nos proporciona APIs para ambas cosas, si bien cada una funciona a su manera.

Esbozo de lo que haremos

La API que te da información sobre las coordenadas es la de geocoding. Sólo precisa pasarle a una url suya por el método GET (o sea, concatenándolas a la propia url) una serie de variables – entre las que se encuentran las susodichas coordenadas – y te devuelve información sobre el lugar que dichas coordenadas marcan. De ahí podemos sacar la dirección fácilmente.

La API que te permite acortar una url larga (también permite “desacortar” una corta) es algo mas compleja, pero no demasiado. En vez de pasarle los parámetros (principalmente, la url larga) por GET, hay que pasársela por POST y, además, en formato JSON. Requiere un poco mas de trabajo que la anterior, pero nada grave.

Ambas APIS te devuelven la información en formato JSON. Para poder trabajar con ella, android incluye unas clases de org.json que facilitan esta labor. Puede parecer complejo, pero con la ayuda de un parser online de JSON y atendiendo a la teoría (todo son objetos o arrays de objetos), se acaba uno entendiendo con este formato.

Por supuesto, todo esto se hace realizando peticiones por internet – en este caso a Google – y esperando las respuestas pertinentes. Como no podemos nunca saber cuánto tardarán dichas respuestas en llegar, todo el proceso (montar la petición, lanzarla, esperar a recibir los datos en JSON, analizarlos y montar los objetos java que encapsulen la información) debe ir en un proceso de fondo o background. Ello se hace para que la interfaz no se quede bloqueada mientras espera las respuestas. Según el caso, se puede seguir usando la app mientras las peticiones de datos se realizan de fondo (como es el caso de las cargas de imágenes remotas como pasa en twicca) y/o se da aviso de que se está procesando algo de fondo (como con un diálogo de carga). Para poder hacer esto, nosotros emplearemos AsyncTasks, unas clases específicas de Android para facilitar la labor con la programación multihilo.

A muy grandes rasgos, nuestra actividad instanciará una AsyncTask para una tarea de duración incierta y se encargará de todo el proceso. En nuestro caso, llamar a la API, esperar la respuesta, analizar dicha respuesta, encapsular la información y devolverla a la Activity. La comunicación de datos entre la Activity y la AsyncTask la implementaremos siguiendo el patrón Observer, esto es, creando un Interfaz de Listener (ej: GeocodingListener) que implementará la Activity (como el caso del OnClickListener que ya hemos visto) y que recibirá la AsyncTask (con un asynctask.setGeocodingListener, por ejemplo). Al terminar el proceso, la propia AsyncTask llamará al método del  Listener (ej: onGeocoding) pasándole el objeto respuesta. Dicho objeto, además de los posibles datos de la respuesta, tendrá información sobre el proceso en sí: si hubo algún error o se alzó alguna excepción, la respuesta no tendrá los datos esperados pero sí dicha información, para así poder actuar  en consecuencia.

En sucesivos artículos iré explicando cómo lo hice. Dejo aquí el repositorio de la aplicación que prueba las clases para trabajar con sendas API de google.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: