April, 2011

  • Avec Windows

    Découvrez les richesses de HTML5 par Microsoft, Wygwam et Steaw

    • 0 Comments

    Bonjour,

    HTML5 est au coeur de beaucoup de discussions en ce moment et pour preuve le MIX 2011 de las Vegas a largement abordé le sujet . Nous vous proposons un webcast en 3 parties animés par 3 spécialistes, Microsoft, Wygwam et l'agence Steaw qui abordreont les suejts suivants :

    • Vidéo 1 - Découvrez les richesses de HTML5 : HTML, CSS3 et SVG
      • Dans cette vidéo, David Rousset de Microsoft nous présente les apports du nouveau format de données conçu pour représenter les pages web.
    • Vidéo 2 - Découvrez les richesses de HTML5 : comment créer du contenu en HTML5 ?
      • Dans cette vidéo, Aurélien Verla de Wygwam nous présente comment créer du contenu grâce au nouveau format de données.
    • Vidéo 3 - Découvrez les richesses de HTML5 : exemples d'intégration d'HTML5
      • Dans cette vidéo, Sébastien Doncker de l'agence Steaw nous présente quelques exemples d’intégration de ce nouveau format de données.

     Cécile

  • Avec Windows

    Déployer Ruby dans Windows Azure

    • 0 Comments

    Vous le savez, Windows Azure est une plateforme qui permet de déployer tous types de technologies; nous vous parlons souvent de Java et de PHP, mais aujourd’hui je voudrais vous montrer comment déployer facilement une application Ruby dans Windows Azure. Cela nous donnera l’occasion de voir quelques petits utilitaires et astuces utiles pour automatiser le déploiement d’applications dans des rôles Windows Azure avec les Startup Tasks.

    Tout d’abord, un petit mot à propos du support de la plateforme Windows Azure en Ruby: je vais utiliser la librairie WAZ-Storage qui permet d’accéder aux Blobs, Tables et Queues Windows Azure depuis une application Ruby. Cela nous permettra donc d’exécuter notre application dans le nuage, et de bénéficier également du stockage non-relationnel.

    Pour partir sur l’application la plus compacte possible, je vais partir sur le framework Sinatra qui permet de développer des applications Web de façon très concise; voici la petite application de test que je vais déployer:

    require 'rubygems'
    require 'sinatra'
    require 'waz-blobs'
    require 'kconv'
    
    
    get '/' do
    	WAZ::Storage::Base.establish_connection!(:account_name => 'foo', :access_key => 'bar', :use_ssl => true)
    	c = WAZ::Blobs::Container.find('images')
    	blobnames = c.blobs.map { |blob| blob.name }
    	blobnames.join("<br/>")
    end
    
    

    Quelques points notables de cette superbe application:

    • Il s’agit d’une application de test qui tournera dans la configuration “développement” de Sinatra, et non dans une configuration de production… Mais cela suffira pour la démonstration!
    • Le fonctionnement de la librairie WAZ-Storage est très simple: remplacez simplement le “foo/bar” dans establish_connection() par votre compte et votre clef, puis choisissez un nom de container qui existe pour l’appel à Container.find()
    • Le code assemble ensuite les noms des Blobs listés en une chaîne de caractères pour l’afficher dans la page
    • La librairie WAZ-Storage expose bien entendu une API beaucoup plus riche, permettant de créer, modifier, détruire des Blobs et des Containers… Vous pouvez aller sur le Github pour télécharger la librairie ou même contribuer ;-)

    Voyons donc comment préparer tout l’environnement pour aller exécuter cette application dans Windows Azure.

    Nous allons utiliser un Worker Role pour exécuter l’interpréteur Ruby. L’avantage de Ruby et du framework Sinatra est que leur empreinte sur le système est très légère: on a simplement à installer l’interpréteur, télécharger quelques Gems et on a tout ce qu’il faut. C’est donc un scénario parfait pour utiliser des Startup Tasks dans un Worker Role, ce qui nous permettra de continuer de bénéficier des avantages du Platform As A Service (mise à jour automatique du système).

    J’ai donc créé un projet de type Cloud Service dans Visual Studio 2010, dans lequel j’ai mis un Worker Role. J’ai ensuite créé dans le projet WorkerRole un répertoire “startup” dans lequel je range tous les fichiers nécessaires pour automatiser l’installation de Ruby. Cela donne ceci:

    image

    Voyons donc l’utilité de tous ces fichiers, dans l’ordre de leur utilisation dans le script de démarrage:

    ruby-1.9.2-p180-i386-mingw32.7z est l’interpréteur proprement dit. J’ai choisi la version RubyInstaller for Windows, qui est prête à l’emploi. J’ai choisi la version 7-Zip plutôt que l’installeur, car cela simplifie l’opération (il suffit d’extraire le contenu de l’archive). J’aurais pu envisager de télécharger l’archive dynamiquement au démarrage (voir ci-après), mais l’installeur faisant à peine 6 Mo, cela ne valait pas le coup!

    test.rb est évidemment mon “application” de test Ruby

    curl est un utilitaire en ligne de commande très répandu, permettant de télécharger des ressources accessibles par des URL (typiquement du HTTP, mais pas seulement). Je ne l’utilise pas pour l’instant, mais il peut rendre de grands services dans une Startup Task: pour télécharger l’interpréteur, ou des composants additionnels, depuis leur site d’hébergement ou depuis le Blob Storage. C’est typiquement ce que j’utiliserais pour des composants plus volumineux, comme un JDK. J’ai choisi le binaire Windows 64-bit sans SSL.

    7za est bien entendu la version ligne de commande de 7-Zip, le meilleur archiveur de la planète. Cette version se trouve sur la page des téléchargements.

    WAUtils va être utilisé dans le script de démarrage pour trouver l’emplacement du stockage local alloué par Windows Azure, dans lequel on va installer l’interpréteur Ruby. Il n’y a en effet pas de moyen de “deviner” ce chemin; le source de WAUtils est extrêmement simple, je l’ai compilé dans un projet à part et simplement ajouté l’exécutable dans le répertoire “startup” de mon projet.

    namespace WAUtils
    
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (args.Length < 2)
                {
                    System.Console.Error.WriteLine("usage: WAUtils [GetLocalResource <resource name>|GetIPAddresses <rolename>]");
                    System.Environment.Exit(1);
                }
    
    
                switch (args[0])
                {
                    case "GetLocalResource":
                        GetLocalResource(args[1]);
                        break;
                    case "GetIPAddresses":
                        break;
                    default:
                        System.Console.Error.WriteLine("unknown command: " + args[0]);
                        System.Environment.Exit(1);
                        break;
                }
            }
    
    
            static void GetLocalResource(string arg)
            {
                LocalResource res = RoleEnvironment.GetLocalResource(arg);
                System.Console.WriteLine(res.RootPath);
            }
        }
    }
    
    

    Comme vous le voyez c’est simplissime, j’utilise essentiellement la méthode RoleEnvironment.GetLocalResource() pour trouver l’emplacement de mon répertoire de stockage.

    Voyons maintenant le fichier ServiceDefinition.csdef de ma solution; j’y trouve la définition de cet emplacement de stockage, que j’ai nommé “Ruby” et pour lequel je demande 1 Go. Je sais d’expérience que cet espace se trouvera situé sur le disque C: de la machine virtuelle dans Windows Azure, mais je ne peux bien entendu pas me fier à cette information, d’où l’utilisation du GetLocalResource().

    <LocalResources>
      <LocalStorage name="Ruby" cleanOnRoleRecycle="false" sizeInMB="1024" />
    </LocalResources>

    Je vais ensuite aller ajouter deux Startup Tasks:

    <Startup>
      <Task commandLine="startup\installruby.cmd" executionContext="elevated" />
      <Task commandLine="startup\startruby.cmd" taskType="background" />
    </Startup>
    • installruby.cmd va s’exécuter en mode Administrateur (même si cela n’est pas réellement nécessaire dans ce cas, mais c’est toujours plus sûr pour des opérations de configuration du système…)
    • startupruby.cmd va réellement démarrer l’interpréteur, tournera en mode non-Administrateur (pour des raisons de sécurité), et en mode “background”, ce qui signifie que le Worker Role n’attendra pas la fin de la tâche pour finir de démarrer.

    Voyons maintenant le contenu de ces deux scripts!

    Tout d’abord, installruby.cmd:

    cd %~dp0
    
    for /f %%p in ('WAUtils.exe GetLocalResource Ruby') do set RUBYPATH=%%p
    
    echo y| cacls %RUBYPATH% /grant everyone:f /t
    
    7za x ruby-1.9.2-p180-i386-mingw32.7z -y -o"%RUBYPATH%"
    
    set PATH=%PATH%;%RUBYPATH%\ruby-1.9.2-p180-i386-mingw32\bin
    
    call gem install sinatra haml waz-storage --no-ri --no-rdoc
    
    exit /b 0
    
    
    

    On est sur du script classiques, voici les différentes étapes:

    • On lance WAUtils.exe pour récupérer le chemin de l’espace disque local, et on le stocke dans une variable RUBYPATH
    • On utilise la commande Windows cacls.exe pour donner tous les droits à ce répertoire
    • On extrait l’archive 7-Zip avec 7za, dans le répertoire RUBYPATH
    • On ajoute le sous-répertoire “bin” de Ruby au PATH système
    • Ensuite, on utilise la commande “gem” pour télécharger dynamiquement les librairies Ruby dont nous avons besin

    Et finalement, startupruby.cmd qui va me lancer mon application:

    for /f %%p in ('startup\WAUtils.exe GetLocalResource Ruby') do set RUBYPATH=%%p
    
    set PATH=%PATH%;%RUBYPATH%\ruby-1.9.2-p180-i386-mingw32\bin
    
    ruby test.rb

    C’est évidemment la ligne “ruby test.rb” qui exécute mon application.

    Voilà, vous avez tous les éléments en mains pour re-créer votre propre service Ruby dans Windows Azure! Je vous proposerai dans un prochain billet de télécharger une version prête à l’emploi de ce package Ruby, exploitable directement et sans passer nécessaire par Visual Studio…

  • Avec Windows

    “Hello FB World” : développement Facebook sur Windows Azure

    • 0 Comments

    Voici le premier billet d’une série que je vais consacrer au développement d’applications Facebook avec Windows Azure. L’approche Cloud et Platform As A Service (PAAS) est en effet particulièrement bien adaptée aux projets d’applications sociales en tout genre:

    • Le faible ticket d’entrée permet de lancer un projet à moindre coût, même si la rentabilité n’est pas au rendez-vous dès le début
    • L’élasticité permettra néanmoins de faire évoluer les ressources techniques très rapidement (CPU, stockage) si le succès est au rendez-vous!
    • L’approche PAAS vous décharge complètement des aspects de mise au point et de maintenance de l’infrastructure
    • Les multiples centres d’hébergement permettent de localiser votre application au bon endroit (Europe, US, Asie) par rapport à votre marché cible
    • L’ouverture de la plate-forme vous laisse le choix des langages, frameworks et outils

    Concrètement, voyons un premier cas de création d’une application Facebook que nous déploierons dans Windows Azure. Facebook propose un certain nombre de SDKs “officiels”, que je compte bien explorer dans le futur, mais dans un premier temps je préfèrerais commencer par un framework .NET pour vous montrer la voie la mieux intégrée avec nos outils de développement.

    Je vais donc utiliser le Facebook C# SDK que vous pourrez trouver sur CodePlex. Il s’agit d’un framework communautaire actif et régulièrement mis à jour.

    Histoire de partir sur une base saine, je vais utiliser le framework ASP.NET MVC 3 et son Package Manager (NuGet) pour assembler un petit “Hello Social World” et le déployer dans Windows Azure. J’utilise Visual Studio 2010, mais vous pourriez faire exactement la même chose avec la version gratuite, Visual Web Developer Express.

    Comment installer tous ces beaux composants? C’est très facile, allez sur www.microsoft.com/web et téléchargez le Web Platform Installer. C’est l’outil magique pour ce genre de projets: vous allez pouvoir installer d’un seul coup votre IDE si vous en avez besoin ainsi que tous les frameworks (MVC, Windows Azure) en une seule fois, avec tous leurs pré-requis!

    Cliquez sur le menu “Products” en haut pour voir tous les composants disponibles, puis faites votre marché! Dans notre cas, prenez “ASP.NET MVC 3” et “Windows Azure Tools for Microsoft Visual Studio”, puis cliquez sur le bouton “Install”.

    image

    Vous devriez maintenant avoir tout ce qu’il vous faut pour attaquer le développement.

    Créer l’application et la tester “à vide”

    Voyons tout d’abord la partie purement Windows Azure / ASP.NET MVC.

    Faites donc “New Project…” puis dans “Web” choisissez “ASP.NET MVC 3 Web Application”. Donnez-lui un nom et faites OK.

    MVC 3 vous demande alors de choisir un template et un View Engine. Comme j’aime les choses simples et propres, je vais partir sur le template “Empty”, et comme j’aime les choses neuves et brillantes, je vais utiliser la syntaxe Razor!

    image

    Créons une mini-application simplistique pour tester: clic droit sur “Controllers”, faites “Add” puis “Controller…” Nommez-le “HomeController”.

    image

    MVC vous génère automatiquement la classe HomeController avec une seule méthode dedans: Index(). Il nous faut maintenant ajouter une View, pour cela rien de plus simple, clic droit sur le nom de la méthode, puis “Add View…”

    image

    Laissez toutes les options par défaut dans le dialogue de création de vue, elles sont parfaites.

    image

    Dans la vue qui s’ouvre, changez le titre en “Hello MVC” (histoire de dire qu’on a quand même fait quelque chose) et vous avez une application MVC en état de marche. Mais avant de la tester, nous allons l’encapsuler dans une application Windows Azure!

    Allez donc dans “File”, “Add”, “New Project…” et cette fois-ci, choisissez un projet de type “Cloud”, “Windows Azure Project”. Donnez-lui un nom sympathique puis cliquez sur OK. Attention: dans le dialogue suivant, ne sélectionnez rien puis cliquez sur OK! En effet, nous voulons réutilisez notre projet MVC en tant que Web Rôle, et non pas créer un nouveau rôle.

    image

    Nous avons donc maintenant un service Windows Azure, mais il n’est pas associé au projet MVC. Faites donc un clic droit sur le répertoire “Roles”, puis choisissez “Web Role Project in solution…”

    image

    Dans le dialogue suivant, sélectionnez votre projet MVC, et c’est fini! Vous avez maintenant construit un service Windows Azure avec une tout belle application MVC 3. Pour tester le tout, je vous propose d’appuyer sans hésitation sur F5 pour tester dans l’environnement de simulation Windows Azure, qui a été installé avec les Tools.

    (Nota Bene: il arrive parfois que votre page de test apparaisse vide (blanche). La raison est généralement que vous n’avez pas activé la fonctionnalité “HTTP Redirection” au niveau de IIS. Si vous allez dans “Turn Windows features on or off” et que vous activez ce module, le routage MVC devrait tomber en marche.)

    Vous avez donc lancé votre page MVC. Notez l’URL dans le navigateur, car nous en aurons besoin pour paramétrer Facebook!

    image

    Configurer l’application dans Facebook

    Si vous n’avez pas encore faire de développement Facebook, vous n’avez probablement pas encore l’application “Developer” que vous utilisez pour configurer vos applications. Cherchez donc “Developer” et ajoutez l’application.

    image

    Vous arrivez sur une page qui vous propose de créer une nouvelle application (bouton “Set Up New App” à droite). Vous verrez peut-être également la trombine de Doug Purdy, ex-Microsoftee parti chez Facebook s’occuper de la promotion de la plate-forme pour les développeurs ;-)

    image

    Donnons donc un nom à notre application, puis vous devrez passer le Captcha.

    image

    Ensuite, allez dans la section “Facebook Integration”, et remplissez la section “Canvas”:

    Puis cliquez sur “Save Changes”.

    image

    Testons en local

    Voilà! Vérifiez que votre Windows Azure Compute Emulator tourne bien, puis accédez à votre application Facebook!

    image

    Votre page MVC est incluse par IFrame pour obtenir le résultat final.

    Ajoutons le SDK Facebook

    Essayons de rendre notre Hello World un tout petit peu plus intéressant. Je vais garder le sujet de l’authentification de l’utilisateur pour un peu plus tard, et je vous propose dans un premier temps d’utiliser la Graph API pour interagir avec Facebook. Nous allons utiliser le nouveau Package Manager qui a été installé avec MVC 3:

    image

    Dans la console qui s’ouvre, sélectionnez bien votre projet dans “Default project”, entrez “install-package facebook”, puis détendez-vous pendant que la librairie s’installe avec tous ses pré-requis!

    image

    Nous pouvons maintenant améliorer un petit peu notre application pour interroger la Graph API. Nous allons simplement récupérer un objet du graphe social par son ID (la page de la Plateforme Facebook) puis afficher ses propriétés dans la vue. Voici notre contrôleur modifié:

    public ActionResult Index()
    
    {
    
        var client = new FacebookClient();
    
        dynamic test = client.Get("19292868552");
    
    
    
        ViewBag.name = test.name;
    
        ViewBag.picture = test.picture;
    
    
    
        return View();
    
    }

    Nous utilisons donc fortement le nouveau type dynamic de C# 4, à la fois pour le retour de l’appel à l’API Facebook et pour le passage des paramètres à la vue via le nouveau ViewBag de MVC 3. Voyons maintenant la vue:

    <h2>Hello @ViewBag.name</h2>
    
    
    
    <img src="@ViewBag.picture" />

    Simplissime! Vous pouvez maintenant relancer votre application et la re-tester via Facebook.

    image

    Voilà, nous avons un petit squelette en place avec une bonne base pour développer une application Facebook dans Windows Azure:

    • Un projet de type Windows Azure avec un Web Role, exécutable en local
    • Un Web Role MVC 3 avec un couple Contrôleur/Vue de base
    • Le SDK Facebook installé et référencé
    • L’application configurée dans Facebook pour tester
    • Un petit appel à la Graph API pour vérifier que tout fonctionne

    …et nous avons beaucoup de choses à voir dans de futurs épisodes!

    • Comment authentifier l’utilisateur Facebook au sein de notre application
    • Comment accéder / exploiter le graphe social
    • Comment déployer l’application en production dans Windows Azure
    • Comment utiliser le framework Facebook JavaScript

    Et si vous avez d’autres idées / questions, n’hésitez pas à me contacter, via Facebook par exemple! :-)

  • Avec Windows

    Windows Azure accueille les développeurs Java

    • 0 Comments

    Nous le répétons depuis le lancement de la plateforme Windows Azure, tous les langages et toutes les plateformes sont bienvenus dans le Cloud! Nous avons notamment souligné lors de la dernière conférence développeurs Microsoft (la PDC10) que nous allions investir tout particulièrement pour faire de Java un “citoyen de première classe” sur la plateforme Windows Azure.

    Nous avons annoncé hier sur le blog de l’équipe Windows Azure le premier pas dans cette direction: la CTP du Windows Azure Starter Kit pour Java. Le but de cette CTP (“Community Technology Preview”) est de recueillir les réactions de la communauté Java sur la meilleure façon d’intégrer les technologies Windows Azure dans l’environnement Java, et notamment faire en sorte que la configuration, le packaging et le déploiement de solutions Java dans Windows Azure se fasse de la façon la plus naturelle possible.

    Concrètement, le Starter Kit se présente sous la forme d’un template de projet Eclipse incluant tous les éléments spécifiques à Windows Azure, ainsi qu’une tâche Ant facilitant l’assemblage du projet pour exécution en local et déploiement en production.

    Vous pouvez lire le billet sur le blog de l’équipe Interopérabilité, qui détaille le fonctionnement du Starter Kit, et qui pointe vers deux tutoriels détaillés:

    En parallèle, l’équipe chargée du développement du driver JDBC pour SQL Server a récemment annoncé une mise à jour du driver JDBC 3.0 pour SQL Server supportant officiellement SQL Azure. Le numéro de version reste le même mais la date de publication a été changée à “2/17/2011”, vérifiez donc que vous utilisez cette nouvelle version pour développer des applications Java se connectant à SQL Azure.

    N’hésitez pas à me faire part de vos expériences de développeurs Java sur Windows Azure!

  • Avec Windows

    Webcast: Installer le plug-in WordPress pour Windows Azure

    • 0 Comments

    Nous avons récemment annoncé la sortie d'un plug-in pour WordPress vous permettant de stocker vos fichiers média (images, vidéos, etc.) dans le stockage Windows Azure plutôt qu'en local chez votre hébergeur, et profiter ainsi de notre offre de stockage "dans les nuages".

    Ce plug-in est un excellent exemple d'utilisation du SDK Windows Azure pour PHP, et illustre bien les capacités d'interopérabilité de la plateforme Windows Azure, accédée ici via une librairie portable "pur PHP".

    Dans ce webcast, je m'attache plutôt au côté pratique et je vous montre comment installer ce plug-in sur un WordPress hébergé sur une offre mutualisée (chez Ikoula pour ne pas les nommer). La petite difficulté dans cette configuration est que l'on a pas accès au fichier php.ini pour référencer le SDK Windows Azure; j'ajoute donc cette référence directement dans le code PHP du plug-in, au moment de l'installation.

     

  • Avec Windows

    Consommer des services OData en Java avec Restlet

    • 0 Comments

    Dans la première partie de ce billet, j’ai rapidement présenté le protocole OData ainsi que quelques interfaces “clientes” permettant de consommer des services.

    Voyons maintenant s’il est également facile de consommer ces données à l’aide d’une API programmatique! Je ne vais pas vous montrer comment consommer ces flux en .NET, car la méthode est somme toute bien connue et bien documentée (“Using a Data Service” sur MSDN par exemple). Par contre, vous allez voir que l’API Java est toute aussi simple d’utilisation.

    Tout d’abord, vous devez télécharger la version 2.0 RC1 du Restlet Framework, annoncée par Jérôme Nouvel de Noelios sur son blog. Restlet est un framework Java très populaire, permettant aux développeurs de développer leurs applications en respectant les principes d’une architecture REST.

    Cette nouvelle version inclut un support amélioré du protocole OData, qui s’inscrit complètement dans le mouvement REST, comme détaillé par Noelios dans ce billet: Restlet supports OData, the Open Data Protocol.

    Je vous conseille de télécharger la version 2.0 RC via la page de téléchargement des derniers snapshots:

    Une fois l’archive dézippée, créons un projet Java classique dans Eclipse et référençons les librairies nécessaires:

    image

    Voici les librairies dont vous avez besoin:

    • org.restlet.jar (la librairie Restlet)
    • org.restlet.ext.odata.jar (l’extension OData)
    • org.restlet.ext.atom.jar (l’extension Atom)
    • org.restlet.ext.xml.jar (l’extension XML)
    • org.restlet.ext.freemarker.jar (l’extension Freemarker)
    • org.freemarker.jar (Freemarker)

    Tout comme dans le monde .NET, l’accès à un service OData se fait en deux temps: l’on utilise tout d’abord un outil pour générer automatiquement les classes encapsulant les entités exposées. L’on peut lancer cet outil en ligne de commande ou via du code, et j’ai choisi cette deuxième option:

    public static void main(String[] args) {
        String[] arguments = {
                "http://api.visitmix.com/OData.svc/",
                "C:\\Users\\tconte\\workspace\\Restlet2ORC1\\src"
            };
        Generator.main(arguments);
    }

    L’on voit ici que l’on appelle le générateur en lui passant en argument l’URL du service OData (dans mon exemple, le service exposant le programme des sessions du MIX10), ainsi que le répertoire dans lequel il ira générer le code.

    Le générateur va alors créer un certain nombre de classes:

    image

    La première série, dans le package “eventmodel”, correspond au différentes entités exposées par le service OData; si l’on ouvre la classe Session.java par exemple, l’on voit que le générateur a automatiquement récupéré l’ensemble des propriétés exposées par les entités et créé les classes avec les membres typés correctement:

    public class Session {

        private String body;
        private String code;
        private Date createdDate;
        private Date endTime;
        private String location;
        private Date modifiedDate;
        private Date publishedDate;
        private String sessionId;
        private String slug;
        private String sourceId;
        private Date startTime;
        private String title;
        private String type;
        private List<File> files;
        private List<Speaker> speakers;
        private List<Tag> tags;

    La deuxième classe créée, ApiVisitmixComService.java (que j’ai déplacé dans le package org.dotpunk.restlet pour mon test), est un objet Service qui va nous permettre de communiquer avec le service OData.

    Voyons donc comment envoyer une requête simple à notre service MIX10:

    public static void main(String[] args) {
        ApiVisitmixComService svc = new ApiVisitmixComService();
        Query<Session> q = svc.createSessionQuery("/Sessions").top(5);
        if (q != null) {
            for (Session s : q) {
                System.out.println(s.getCode() + " " + s.getTitle());
            }
        }
    }

    Ici, l’on récupère simplement les cinq premières entités de type Session, et l’on affiche le code session et son titre.

    L’on peut bien entendu aller beaucoup plus loin avec l’API OData de Restlet, qui autorise notamment les ajouts/modifications/destructions d’entités, les System Query Options de OData comme $top, $filter ou $orderby, etc.

    Pour aller plus loin, je vous encourage à suivre le tutoriel complet mis à disposition sur le site du Framework Restlet.

  • Avec Windows

    Interopérabilité des données avec OData

    • 0 Comments

    Nous avons annoncé hier au MIX10 de nombreuses nouvelles concernant le Open Data Protocol (OData), ainsi qu’un SDK très riche et interopérable, permettant de créer des applications multi-plateformes fondées sur la consommation simple de données.

    OData est un protocole ouvert de partage de données que Microsoft met à disposition via la Microsoft Open Specification Promise (OSP), permettant à tout un chacun d’implémenter ou d’utiliser le protocole pour consommer ou exposer des données.

    Ce protocole OData a un historique assez riche, trouvant ses origines dans le projet Astoria lancé en 2007 sous la forme d’une CTP, puis intégré dans le Framework .NET 3.5 SP1 sous le nom de ADO.NET Data Services, et re-renommé WCF Data Services dans le Framework 4.0. WCF Data Services est une implémentation concrète vous permettant d’exposer facilement un modèle de données, par exemple un schéma Entity Data Model (EDM), mais également toute autre source de données, sous une forme simple à consommer par tout type de client. Cette forme, c’est le protocole OData, qui n’avait pas réellement de nom dans les premières itérations du projet Astoria/Data Services, et qui a été baptisé et ouvert afin que tout le monde puisse l’exploiter.

    En syntèse, l’on a annoncé au MIX10 une toute nouvelle version du site OData.org présentant le protocole & sa spécification, ainsi qu’un SDK OData incluant une quantité de ressources facilitant l’exposition de services OData et leur consommation depuis n’importe quel client:

    Ce SDK est donc fortement tourné vers l’interopérabilité et démontre l’agilité qu’offre le protocole OData pour le développement d’applications basées sur les données, et ce quel que soit le terminal cible: PC ou mobile ou navigateur Web, .NET ou non, Microsoft ou pas!

    Le billet de J.-C. Cimetière sur le blog Interoperability @ Microsoft se concentre sur le SDK PHP, avec une vidéo de démo, je vais donc pour ma part me concentrer sur l’API Java, intégrée au framework Restlet de Noelios, référence en matière de REST dans le monde Java.

    Rapide introduction au protocole OData

    Le protocole OData a pour objectif de simplifier le partage de données en se basant sur les principes REST, à savoir l’utilisation de la simple syntaxe du protocole HTTP ainsi que sur des représentations facilement exploitables, typiquement du XML et du JSON.

    Pour illustrer tout de suite la flexibilité qu’apporte ce protocole, voyons comment l’on peut exploiter les informations exposées par le site du MIX10; ouvrez simplement l’URL suivant dans votre navigateur:

    http://api.visitmix.com/OData.svc/

    Et vous verrez le document XML suivant s’afficher:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <service xml:base="http://api.visitmix.com/OData.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
     <workspace>
      <atom:title>Default</atom:title>
      <collection href="Sessions">
       <atom:title>Sessions</atom:title>
      </collection>
      <collection href="Speakers">
       <atom:title>Speakers</atom:title>
      </collection>
      <collection href="Tags">
       <atom:title>Tags</atom:title>
      </collection>
      <collection href="Files">
       <atom:title>Files</atom:title>
      </collection>
     </workspace>
    </service>

    Ce document XML forme le Service Document, qui vous permet de découvrir les flux de données exposés par le service. L’on voit que le format XML est très simple à lire, et que l’on a des flux pour les Sessions, Speakers, etc.

    Comment accéder à ces flux? Simple! Il suffit d’ajouter à notre URL le nom du flux, cmme ceci par exemple:

    http://api.visitmix.com/OData.svc/Sessions/

    Si vous ouvrez cet URL dans Internet Explorer, quelque chose de magique se passe: IE ayant détecté que la réponse était un fichier au format RSS (en réalité au format AtomPub, mais que IE interprète comme du RSS), il lui applique une feuille de style permettant de l’afficher de façon lisible.

    Comme nous nous intéressons au format de données effectivement renvoyé, nous pouvons regarder le source de la page pour récupérer le document XML d’origine, et l’on voit quelques chose comme ça:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <feed xml:base="http://api.visitmix.com/OData.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
     <title type="text">Sessions</title>
     <id>http://api.visitmix.com/OData.svc/Sessions/</id>
     <updated>2010-03-17T16:52:18Z</updated>
     <link rel="self" title="Sessions" href="Sessions" />
     <entry>
      <id>http://api.visitmix.com/OData.svc/Sessions(guid'816995df-b09a-447a-9391-019512f643a0')</id>
      <title type="text">Building Web Applications with Microsoft SQL Azure</title>
      <summary type="text">SQL Azure provides a highly available and scalable relational database engine in the cloud. In this demo-intensive and interactive session, learn how to quickly build web applications with SQL Azure Databases and familiar web technologies. We demonstrate how you can quickly provision, build and populate a new SQL Azure database directly from your web browser. Also, see firsthand several new enhancements we are adding to SQL Azure based on the feedback we’ve received from the community since launching the service earlier this year.</summary>
      <published>2010-01-25T00:00:00-05:00</published>
      <updated>2010-03-05T01:07:05-05:00</updated>
      <author>
       <name />
      </author>
      <link rel="edit" title="Session" href="Sessions(guid'816995df-b09a-447a-9391-019512f643a0')" />
      <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Speakers" type="application/atom+xml;type=feed" title="Speakers" href="Sessions(guid'816995df-b09a-447a-9391-019512f643a0')/Speakers" />
      <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Tags" type="application/atom+xml;type=feed" title="Tags" href="Sessions(guid'816995df-b09a-447a-9391-019512f643a0')/Tags" />
      <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Files" type="application/atom+xml;type=feed" title="Files" href="Sessions(guid'816995df-b09a-447a-9391-019512f643a0')/Files" />
      <category term="EventModel.Session" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
      <content type="application/xml">
       <m:properties>
        <d:SessionID m:type="Edm.Guid">816995df-b09a-447a-9391-019512f643a0</d:SessionID>
        <d:Location>Breakers L</d:Location>
        <d:Type>Seminar</d:Type>
        <d:Code>SVC07</d:Code>
        <d:StartTime m:type="Edm.DateTime">2010-03-17T12:00:00</d:StartTime>
        <d:EndTime m:type="Edm.DateTime">2010-03-17T13:00:00</d:EndTime>
        <d:Slug>SVC07</d:Slug>
        <d:CreatedDate m:type="Edm.DateTime">2010-01-26T18:14:24.687</d:CreatedDate>
        <d:SourceID m:type="Edm.Guid">cddca9b7-6830-4d06-af93-5fd87afb67b0</d:SourceID>
       </m:properties>
      </content>
     </entry>
    </feed>

    Je n’ai laissé qu’une seule entité pour abréger! L’on voit que l’on a ici un document XML au format AtomPub, auquel l’on a ajouté des extensions (les éléments définis dans les namespaces m: et d:). Ces extensions au format Atom sont bien entendu décrites dans le protocole, et justement permises par le format Atom lui-même (autrement dit, un client capable de consommer un flux Atom pourra consommer un flux OData).

    Je ne vais pas rentrer pour le moment dans le détail du format OData, mais l’on voit rapidement que l’on a les éléments Atom classiques, semblables à ceux que l’on trouve dans un flux RSS (“title”, “summary”, etc.), des liens représentant des relations à d’autres entités (par exemples les Speakers ou les Tags associés à cette Session), puis les champs spécifiques à l’entité Session.

    Maintenant, voyons rapidement ce que l’on peut exprimer comme paramètres de requête au niveau de l’URL:

    Je ne vais pas vous détailler l’ensemble des conventions disponibles dans les URI, vous pourrez les consulter dans la spécification du protocole, mais l’on peut somme toute être assez expressif dans ce cadre pourtant restrictif!

    Bien entendu, vous avez sûrement envie de consulter ces données avec une interface un peu plus utilisable que la barre d’adresse de votre navigateur et des documents XML! Nous avons d’ores et déjà de nombreux clients disponibles pour consommer du OData:

    Pointez ces clients sur le même URL que précédemment, et vous pourrez consommer les flux de façon plus agréable! Voici par exemple le flux dans le ODataExplorer:

    image

    Dans LINQPad, accédé via une expression LINQ:

    image

    Et un graphe créé en quelques secondes à partir des données via PowerPivot et Excel:

    image

    Après cette introduction, je vous donne rendez-vous dans la deuxième partie de ce billet pour explorer l’API Java du framework Restlet!

Page 1 of 1 (7 items)