Actualité Tutoriels Liens contact dotnet-tech.com - Home - Tutoriels techniques avec code source Dotnet-tech.com : Les site sur les technologies .Net

PicasaNet : Accédez à vos WebAlbums Google Picasa, restitution dans un ControlToolkit Ajax, Sérialisation et Désérialisation avec les technologies ASP.Net 2.0 et c#

 

20 Avril 2007

Par Laurent Geffroy

http://www.laurentgeffroy.com




Version PDF à télécharger
Code Source



 

Droit de diffusion et copyrights :

Ce tutoriel ne peut être diffusé sur d’autres sites Web ou tout autre support sans l’autorisation préalable de son auteur. L’utilisation des sources est totalement libre de droits.

Toutes les marques citées appartiennent à leurs auteurs, en particulier les marques Google, Picasa, ainsi que leurs logos respectifs sont des marques déposées par Google Inc.

 

Avant propos :

Cela fait bientôt un an que j’ai découvert  le framework Atlas, renommé ASP.Net Ajax 1.0. La richesse de cette technologie offre de nombreuses voies pour des tutoriels et la sortie de Picasa2 me permet d’aborder sur un cas concret. Début Janvier 2007, me voila en route pour faire un SlideShow en Ajax. 3 jours plus tard, le voici disponible dans la AjaxControlToolkit, réduisant à néant mes premières approches !!! Restait à l’améliorer et à l’adapter quelque peu.

 

Picasa dispose donc d’une API assez simple, qui s’attaque par une requête http en GET toute simple. L’exposition se fait via un flux rss, assez verbeux et qu’il convient de nettoyer. Nous aborderons ici des points techniques que j’ai pu déjà exposer lors de précédents tutoriels. Mais mieux vaut se répéter et disposer d’un tutoriel complet.

 

Ainsi nous aborderons les points suivants :

-           Récupération du flux XML via un HttpResponse

-           Transformation du flux via XSL

-           Désérialisation des données dans une classe .Net

-           L’utilisation du composant PicasaNet

 

Puis coté Ajax

-           Le WebService permettant de récupérer les requêtes

-           Le Toolkit Ajax et son fonctionnement

 

Le tutoriel s’articule sur une solution disposant :

-           Du projet PicasaNet qui permet d’interagir avec l’API de Picasa et qui dispose d’un AjaxControlToolkit

-           Un projet Web qui exploite le composant Ajax et l’API de PicasaNet

 

 

 

1.      PicasaNet

1.1              Qu’est-ce que c’est ?

 

PicasaNet est un composant gratuit et libre de droits qui vous permet d’interroger l’API de Google Picasa. Les données récupérées sont stockées dans des classes propres à PicasaNet, ce qui simplifie grandement l’accès, la manipulation et d’utilisation des informations fournies par Google Picasa. Le mode de récupération est plutôt évolutif. En ayant accès aux sources vous pouvez parfaitement enrichir les informations récupérées par PicasaNet.

 

La récupération est assez originale car elle se base sur une transformation XSL pour se caler aux structures des classes PicasaNet. Ce n’est peut être pas forcément la manière la plus efficace de faire, mais elle permet d’aborder une méthode différente et techniquement plus intéressante.

 

projetPicasaNet.jpg

Le dossier AjaxToolkit dispose du composant Ajax qui permet de restituer le contenu d’un WebAlbum Picasa.

 

Notez que le fichier JS doit absolument être une ressource incorporée. Pour cela, sélectionnez votre fichier, puis dans l’écran de propriétés, Action de génération choisissez « Ressource incorporée ».

 

 

Les dossiers Collections et Elements disposent de classes qui permettent de stocker les données issues de Picasa.

 

Response dispose des classes de base à utiliser. ListOfAlbums pour disposer de l’ensemble des albums d’un compte et PictureAlbum pour avoir l’ensemble des images d’un album.

 

Dans Xsl vous trouverez les deux feuilles de style qui permettent de transformer le flux RSS Picasa vers la structure PicasaNet. Ces feuilles de styles devront être déployées manuellement sur le site Web.

 

Picasa.cs est la classe de base à instancier pour utiliser le composant.

 

 

Il est à préciser que vous devez avoir installer l’environnement AJAX 1.0 pour modifier ou compiler ce composant.

Rendez vous sur http://ajax.asp.net/downloads/default.aspx?tabid=47 et installez :

-           ASP.Net 2.0 AJAX Extensions

-           ASP.Net AJAX Control Toolkit

-           ASP.Net Ajax Futures CTP

 

 

 

1.2              La récupération des flux XML

1.2.1        Tester son application avec ces propres URL

Il vous est bien entendu possible de tester vos propres Url de flux RSS Picasa notamment lorsque vous être en mode déconnecté. L’objet Picasa dispose d’une propriété AllowUrlChanging que vous pouvez mettre à True. Cela permet ensuite d’être en mesure de fournir vos propres Url locales ou distantes en modifiant ensuite les propriétés SetGoogleAlbumsListUrl (pour le flux de liste des albums) et SetGoogleAlbumUrl (pour le flux d’un album). Si ces propriétés ne sont pas initialisées, l’API prendra l’Url par défaut de Google Picasa, à laquelle il ajoutera les données variables comme le compte Picasa et éventuellement le numéro d’Album.

 

1.2.2        La liste des albums

La méthode GetAlbumsList() vous permet de récupérer dans une classe ListOfAlbums l’ensemble des albums d’un compte Google Picasa déterminé.

 

La première étape consiste à vérifier si le compte Picasa est bien fourni. C’est la méthode privée CheckRequiredArgs qui s’en charge. Elle ne vérifie la présence des données obligatoires que si vous laissez à l’API le soin de définir les Url de destination (voir chapitre 1.2.1). En fonction, BuildRequestForListOfAlbums construira la requête dans la variable _request qui est une variable membre.

 

                if (CheckRequiredArgs(_user))

                {

                    // Build httpRequest set _request variable

                    BuildRequestForListOfAlbums();

                    // Send Request the Google Picasa

                    HttpWebResponse v_response = DoGetResponse(_request);

 

DoGetResponse  récupère le contenu du flux RSS. Il s’agit d’invoquer un HttpWebRequest sur l’url construite. Il aurait été possible d’utiliser ici directement la variable membre _request plutôt qu’un paramètre dans la méthode.

 

        private HttpWebResponse DoGetResponse(string p_url)

        {

            HttpWebRequest v_request = null;

            HttpWebResponse v_response = null;

 

            // Initialise the web request

            v_request = (HttpWebRequest)HttpWebRequest.Create(p_url);

 

            v_request.UserAgent = USERAGENT;

 

            v_request.Timeout = _timeOut;

            v_request.KeepAlive = false;

 

            v_request.Method = "GET";

 

            if (Proxy != null)

                v_request.Proxy = Proxy;

 

            try

            {

                // Get response from the internet

                v_response = (HttpWebResponse)v_request.GetResponse();

            }

            catch (WebException ex)

            {

throw new Exception("DoGetResponse:Error while requesting url " + p_url + ". Error Status " + ex.Status + " " + ex.Message);

            }

            catch (Exception exc)

            {

                throw new Exception("DoGetResponse:Error : " + exc.Message);

            }

            return v_response;

        }

 

De retour dans notre méthode appelante, je place la réponse ainsi obtenue dans un StreamReader, car il me faut encore transformer le format RSS Picasa dans une structure PicasaNet que je pourrais désérialiser. La méthode XslTransform  s’occupe à la fois de la transformation XSL mais également de la désérialisation. Ce point technique est détaillé dans le chapitre 1.3. Si la transformation et la désérialisation se sont bien déroulées, la variable de retour v_result est initialisée avec _albumList qui comporte la liste des albums. Cette variable membre est initialisée par la méthode XslTransform.

                    // I have a response

                    if (v_response != null)

                    {

                        // Put the XML response into a StreamReader

                        v_sr = new StreamReader(v_response.GetResponseStream());

 

// Ready to be transformed while the appropriate XSL Style Sheet

if (XslTransform(v_sr.BaseStream, BuildXsltPath(TransformationType.ALBUMS), TransformationType.ALBUMS))

                            v_result = _albumList;

                    }

 

1.2.3        Un album en particulier

La récupération d’un album en particulier fonctionne de la même manière que la récupération d’une liste. Si l’Url est définie par l’application, le numéro de l’album est obligatoire. On utilisera la méthode GetAlbum. Cette méthode est surchargée et permet de passer le numéro de l’album via l’objet PicasaNet.Picasa ou bien en paramètre de la méthode.

 

1.3              La transformation des flux

 

La méthode privée XslTransform attend 3 arguments :

-           Le streamReader du flux RSS de Google Picasa

-           Le chemin de la feuille de style

-           Le type de transformation via une énumération

 

Le chemin de le feuille de style est initialisé à l’instanciation de l’objet PicasaNet.Picasa. Le nom de la feuille de style est fixe pour chaque type de transformation et ne doit pas être modifiée.

 

La transformation effectuée, vient ensuite la désérialisation. En fonction du type (p_type) , la méthode procède donc à la désérialisation et initialise la bonne variable membre.

 

 

                // Deserialized the transformed XML

                switch (p_type)

                {

                    case TransformationType.ALBUMS:

                        // For the list of Albums

                        v_serializer = new XmlSerializer(typeof(ListOfAlbums));

                        _albumList = (ListOfAlbums)v_serializer.Deserialize(v_xreader);

                        break;

                    case TransformationType.ALBUM:

                        v_serializer = new XmlSerializer(typeof(PictureAlbum));

                        _album = (PictureAlbum)v_serializer.Deserialize(v_xreader);

                        break;

                }

                v_result = true;

 

 

1.4              L’utilisation du composant

Le projet Web fournit 2 exemples, l’un pour la liste des albums, l’autre pour l’accès à un album en particulier. Pour chacun des cas, deux pages permettent d’afficher le flux XML. :

-           Récupération d’un flux local, transformation XSL et affichage direct de la transformation

-           Récupération d’un flux distant chez Google Picasa, transformation XSL, désérialisation et resérialisation, pour le fun….

L’utilisation de l’une ou l’autre est possible en ajoutant ou supprimant un argument fictif dans l’url. La requête avec argument interrogera directement Google Picasa.

Pour restituer le flux XML, on se place maintenant sur la solution Web et les pages ListOfAlbums.aspx et Album.aspx

Si vous utilisez des Thèmes dans votre application Web, veillez bien à ajouter les attributs Theme, SylesheetTheme, EnableTheming à vos pages qui doivent retourner un flux XML ainsi que les attributs ResponseEncoding et ContentType :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListOfAlbums.aspx.cs" Inherits="ListOfAlbums" ContentType="text/xml" ResponseEncoding="utf-8" Theme="" StylesheetTheme="" EnableTheming="false" %>

1.4.1        Liste des albums

 

Dans le code behind de la page ListOfAlbums.aspx on dispose du code qui d’une part fait une simple transformation des fichiers locaux (disponibles dans le jeu de test) et d’autre part utilise l’API PicasaNet, toujours instanciée avec le compte Picasa et le chemin des feuilles de styles, ces données étant stockées dans le Web.Config. Dans le second cas, on procède à une sérialisation de la classe ListOfAlbums vers le Response.OutputStream .

 

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.ContentType = "text/xml";

        Response.ContentEncoding = System.Text.Encoding.UTF8;

        string _out = string.Empty;

  PicasaNet.Picasa picasa = new     PicasaNet.Picasa(ConfigurationManager.AppSettings["GooglePicasaUser"], ConfigurationManager.AppSettings["XslPath"]);

 

        if (Request.QueryString.Count == 0)

        {

            // First solution

            // Loading 2 files, running transformation

            string _xsl = "http://localhost/WebPicasa/xslt/ListOfAlbums.xslt";

            string _xml = "http://localhost/WebPicasa/xmlsamples/Albums.xml";

     

            _out = picasa.RunXmlXslStandaloneTransformation(_xml, _xsl);

 

            Response.Write(_out);

        }

        else

        {

            // Second solution

            // Loading Picasa XML File, Deserialization and Serialization for the fun !

            PicasaNet.ListOfAlbums _liste = picasa.GetAlbumsList();

            XmlSerializer serializer = new XmlSerializer(typeof(PicasaNet.ListOfAlbums));

            serializer.Serialize(Response.OutputStream, _liste);

        }

        picasa.Dispose();

        Response.End();

    }

 

 

 

 

1.4.2        Album spécifique

 

Pour un album spécifique, la technique est quasiment identique à celle du chapitre précédent. On s’attardera plus sur l’utilisation de l’API de PicasaNet, disponible dans le code behind de la page Album.aspx. L’exemple nettoyer montre bien d’une part l’instanciation de l’objet PicasaNet.Picasa avec ces valeurs de base (compte et chemin des feuilles de style) mais surtout dans un second temps l’appel de GetAlbum avec l’album a récupérer, dont l’ID est stockée dans le Web.Config.

 

        Response.ContentType = "text/xml";

        Response.ContentEncoding = System.Text.Encoding.UTF8;

        string _out = string.Empty;

        PicasaNet.Picasa picasa = new PicasaNet.Picasa(ConfigurationManager.AppSettings["GooglePicasaUser"], ConfigurationManager.AppSettings["XslPath"]);

 

       // Second solution

       // Loading Picasa XML File, Deserialization and Serialization for the fun

       PicasaNet.PictureAlbum _album = picasa.GetAlbum(ConfigurationManager.AppSettings["GooglePicasaDemoAlbumID"]);

       XmlSerializer serializer = new XmlSerializer(typeof(PicasaNet.PictureAlbum));

       serializer.Serialize(Response.OutputStream, _album);

       

        picasa.Dispose();

        Response.End();

 

 

Comme vous pouvez le voir, l’utilisation de l’API de PicasaNet est très simple, l’API de Google Picasa étant elle aussi très basique. Il est bien entendu possible d’enrichir les classes de stockage de PicasaNet, d’une part en ajouter des accesseurs publics aux classes de structures, mais également en enrichissant les différentes feuilles de styles qui doivent reflèter fidèlement la structure des classes.

 

Comme vous avez pu vous en rendre compte, certains attributs sont ajoutés aux accesseurs publics pour les transformer en attributs XML ou voir renommer des accesseurs coté XML. Ainsi, tous les accesseurs commencent par une majuscule, par contre, ceux transformés en attributs sont mis coté XML en minuscules.

 

Mais attention dans l’utilisation des données dans le composant AJAX : Dans la classe Album, j’ai un accesseur Id qui est mis en Attribut sous la forme id. Lors de l’utiliation de mon WebService qui va resérialiser cette classe, il mettra bien id dans le résultat de la requête SOAP. Cependant, dans le composant AJAX, lorsque vous voudrez parcourir votre flux XML, il conserve le nom original de l’accesseur, soit Id. Ce petit désagrément m’a valu un bon mal de crane.

 

    [Serializable]

    public class Album

    {

        #region PRIVATE MEMBERS

        private string _id = string.Empty;

        private string _url = string.Empty;

        private string _name = string.Empty;

        private string _description =