![]() |
|
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
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 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.
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 -
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 = |