- EL CONOCIMIENTO ES Y DEBE SER LIBRE -

viernes, agosto 13, 2010

Primeros Pasos con la API de datos de Picasa con Google Web Toolkit

Este post debió ser el doble del tamaño que se muestra, pero debido a que me presentaron a la clase JsonpRequestBuilder se disminuyo considerablemente.

Qué puedo hacer con  la Api de Datos de Picasa?
La Api de datos de Picasa te permite modificar, añadir o eliminar álbumes o fotos de Picasa utilizando el Google Data Protocol.
Google Data Protocol, es utilizado  por muchas Apis de Google (Youtube, Reader, Calendar,Picasa etc ). 
El esfuerzo que imprimas en aprender Google Data Protocol te permitirá utilizar los múltiples servicios que Google pone a tu disposición.

Cómo realizo consultas con la Api de Datos de Picasa?
Las consultas las realizaremos con requerimientos HTTP, dichos requerimientos devolverán la respuesta en formato XML o JSON según indiquemos. Para probar su funcionamiento puedes usar cualquier navegador y enviar el siguiente requerimiento:
http://picasaweb.google.com/data/feed/api/user/tombrad2/album
/LaLisera?prettyprint=true&alt=json
“tombrad2” es el usuario de Picasa.
“LaLisera” es el álbum del usuario sobre el cual realizamos la consulta.
 “prettyprint=true” nos muestra la consulta en un formato legible.
“alt=json” le decimos que la respuesta sea en formato JSON.

Algunos ejemplos de consultas a la Api de Datos de Picasa
No está de más hacerles recordar que las consultas que se muestran las pueden realizar en cualquier navegador de su preferencia.
Teniendo como referencia el documento de acá, aquí brindo algunas consultas de las múltiples que se pueden realizar.
http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?prettyprint=true
&alt=json&fields=title,subtitle,icon
Muestra  los campos del album "ParquePeru":”title”,”subtitle” y “icon”.
http://picasaweb.google.com/data/feed/api/user/
tombrad2?prettyprint=true
Muestra los datos de los álbumes del usuario “tombrad2”
http://picasaweb.google.com/data/feed/api/user/
tombrad2/album/ParquePeru?alt=json
&fields=entry/media:group/media:description,entry/media:group/media:thumbnail&kind=photo&thumbsize=640
Muestra las fotos asociadas al álbum “ParquePeru”, con los campos “description” y “thumbanail”. Para una mejor visualización en tu navegador, no te olvides agregar “prettyprint=true”.

Cómo utilizar la Api de Datos de Picasa con Google Web Toolkit?
Antes de responder la pregunta permítanme presentarles a la Clase JavaScriptObject. La Clase  JavaScriptObject es normalmente declarado como el tipo de retorno en un método JSNI (los métodos JSNI pueden declarar tipo de dato retornado a diferencia de los métodos JavaScript nativos). Lamentablemente a la instancia de la Clase (Objeto) JavaScriptObject no podemos utilizarlo directamente en GWT. Para acceder a la data de un Objeto JavascriptObject tenemos dos alternativas. La primera alternativa es descrita en este artículo, la segunda alternativa es utilizar el Objeto JSONObject que recibe en su constructor al Objeto JavaScriptObject. En este post usaremos JSONObject.
GWT permite acceder a requerimientos cross domain mediante la clase JsonpRequestBuilder del siquiente modo:
public void onModuleLoad() {
  
  String url ="http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?alt=json-in-script&fields=entry/media:group/media:description,entry/media:group/media:thumbnail&kind=photo&thumbsize=640";  
  JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
   jsonp.requestObject(url,  new AsyncCallback<JavaScriptObject>(){

    @Override
    public void onFailure(Throwable caught) {
   
     Window.alert(caught.getMessage());
    }
    @Override
    public void onSuccess(JavaScriptObject object) {

     JSONObject obj=new JSONObject(object);
     
     Ejecutar(obj);
     
    }});
  
 }//end function
Mostrando el Ejemplo
En la línea 35 pueden observar cómo se declara la instancia de la clase JSONObject y como se le pasa en el constructor la instancia de la clase JavaScriptObject.
En la líneas  10 y 11 se puede observar la recuperación de los datos almacenados en la instancia de la clase JSONObject. No te dejes intimidar por la aparente complejidad de recuperación de datos!.
public class Apipicasa implements EntryPoint {
 
 VerticalPanel vp=new VerticalPanel();
 
 public void Ejecutar(JSONObject obj){
  int size=(int)obj.get("feed").isObject().get("entry").isArray().size();
  
  for(int i=0;i<size;i++)
  {
   String url=obj.get("feed").isObject().get("entry").isArray().get(i).isObject().get("media$group").isObject().get("media$thumbnail").isArray().get(0).isObject().get("url").isString().stringValue();
   String descripcion=obj.get("feed").isObject().get("entry").isArray().get(i).isObject().get("media$group").isObject().get("media$description").isObject().get("$t").isString().stringValue();
   
   vp.add(new Image(url));
   vp.add(new HTML(descripcion));
   
  }
 
  RootPanel.get().add(vp);
 }//end function
 
 public void onModuleLoad() {
  
  String url ="http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?alt=json-in-script&fields=entry/media:group/media:description,entry/media:group/media:thumbnail&kind=photo&thumbsize=640";  
  JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
   jsonp.requestObject(url,  new AsyncCallback<JavaScriptObject>(){

    @Override
    public void onFailure(Throwable caught) {
   
     Window.alert(caught.getMessage());
    }
    @Override
    public void onSuccess(JavaScriptObject object) {

     JSONObject obj=new JSONObject(object);
     
     Ejecutar(obj);
     
    }});
  
 }//end function
}