Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Astoria : un Data Service basé sur REST par Microsoft

Lors du Mix de las Vegas, Microsoft a annoncé de très nombreux projet, je me suis récemment interessé au projet nom de Code Astoria.

Qu'est-ce que Astoria ?

The goal of Microsoft Codename Astoria is to enable applications to expose data as a data service that can be consumed by web clients within a corporate network and across the internet. The data service is reachable over regular HTTP requests, and standard HTTP verbs such as GET, POST, PUT and DELETE are used to perform operations against the service. The payload format for the service is controllable by the application, but all options are simple, open formats such as plan XML and JSON. Web-friendly technologies make Astoria an ideal data back-end for AJAX-style applications, and other applications that need to operate against data that is across the web.
source : http://msdn2.microsoft.com/en-us/data/bb419139.aspx 

Autrement dit, Astoria est un projet qui permet d'exposer ces données via un data service REST sous le format XML, RDF ou JSON se basant sur EDM (Entity Data Model).

Mais tout d'abord qu'est-ce que REST ?

REST (REpresentational State Transfer) est un terme inventé par Roy Fielding, cela symbolise une architecture qui se base sur HTTP dans laquelle une URI (Uniform Resource Identifier) indique l'adresse d'une ressource qui peut être représenté selon plusieurs formats, on peut faire plusieurs choses avec une URI, ces actions sont définit en fonctions du verbe HTTP (GET, POST, PUT, DELETE, ...).

Pour en savoir plus sur REST je vous conseille cet article : Comment j’ai expliqué REST à ma femme ou la traduction française du chapitre 5 de la thèse de Roy Fielding : Thèse de Roy T. Fielding - Traduction du Chapitre 5 : REST

Par exemple l'uri http://myserver/data.svc/Customers représente une collection de clients, si l'on veut accéder aux données  d'un client précis on utilisera cette uri http://myserver/data.svc/Customers[ALFKI] où ALFKI est l'identifiant du client. Pour accèder à toutes les commandes d'un clientt on utilisera cette uri : http://myserver/data.svc/Customers[ALFKI]/Orders 

Mais que nous retourne l'uri http://myserver/data.svc/Customers[ALFKI]  lorsque l'on y accède via le verbe http GET ? en fait cela dépend de l'en-tête accept-header de la requête HTTP. Par défaut cela retournera du XML :

<DataService xml:base="http://myserver/data.svc"> <Customers> <Customer uri="Customers[ALFKI]"> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Address>Obere Str. 57</Address> <City>Berlin</City> <Region /> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> <Fax>030-0076545</Fax> <Orders href="Customers[ALFKI]/Orders" /> </Customer> </Customers> </DataService>

Mais si notre accept-header vaut "application/json" la réponse sera :

[ { __metadata: { Type: "Customer", Base: "http://myserver/data.svc", Uri: "Customers[ALFKI]" }, CustomerID: "ALFKI", CompanyName: "Alfreds Futterkiste", ContactName: "Maria Anders", ContactTitle: "Sales Representative", Address: "Obere Str. 57", City: "Berlin", Region: null, PostalCode: "12209", Country: "Germany", Phone: "030-0074321", Fax: "030-0076545", Orders: { __metadata: { Uri: "Customers[ALFKI]/Orders" } } } ]

On voit que la collection Orders est représentée par une URI, c'est cette URI qui faudra utiliser pour accéder aux commandes du client.

Encore plus intéressant : un service REST permet de faire différentes actions avec une URI pour cela on utilise différents verbes HTTP. Si l'on envoie les requêtes ci-dessous avec le verbe POST à cette uri http://host/vdir/northwind.svc/Categories alors une nouvelle catégorie sera créée.

<DataService> <Category> <CategoryName>New Category</CategoryName> </Category> </DataService>
ou
JSON: { __metadata: { Type: "Category" }, CategoryName: "New Category" }

On peut aussi faire des mis à jour en utilisant le verbe PUT et des suppressions avec le verbe DELETE.

Concrétement, que nous apporte Astoria ?

Astoria va nous permettre de gérer tout ce DataService sans écrire une ligne de code, pour cela il se base sur EDM (Entity Data Model). Il suffit donc de créer un nouveau Entity Data Model dans Visual Studio Orcas puis un nouveau Web Data Service où il suffira de spécifier le type de l'EDM. 

Le projet doit donc ressembler à ça :

 

Mais Astoria ne se limite pas à gérer le Data Service, il nous permet aussi d'utiliser un Data Service à partir de code C# :

class Program { static void Main(string[] args) { WebDataContext ctx = new WebDataContext("http://localhost:1234/Northwind.svc"); WebDataQuery<Category> categories = ctx.CreateQuery<Category>("/Categories?$orderby=CategoryName", QueryOption.IgnoreMissingProperties); foreach (Category c in categories) { Console.WriteLine(c.CategoryName); } } }

Mais là où c'est vraiment intéressant c'est la possibilité d'accéder aux données via le format JSON donc très facilement via JavaScript :

function ListCategories() { var req = new Sys.Net.WebRequest(); req.set_url('Northwind.svc/Categories'); req.get_headers()["Accept"] = 'application/json'; req.add_completed(onCategoriesCompleted); req.invoke(); } function onCategoriesCompleted(response) { if(response.get_statusCode() != 200) alert('Error retrieving categories: ' + response.get_responseData()); else { var res = response.get_object(); var categories = $get('Categories'); for(var i = 0; i < res.length; i++) { var elmt = document.createElement('li'); elmt.appendChild(document.createTextNode(resIdea.CategoryName)); categories.appendChild(elmt); } } }

Pour l'instant il faut faire la requête XMLHttpRequest "à la main" (ici en utilisant Microsoft Ajax Library) mais j'espère que le projet Astoria viendra avec un framework client qui nous permettra d'accéder aux données encore plus facilement.

Envie de regarder plus en détail Astoria

Astoria est un projet incubateur, on est très loin d'une version RTM voir même bêta, il risque d'y avoir de nombreux changement à ce projet, pour l'instant je n'ai pas encore vu de date de sortie, mais cela ne devrait pas arriver avant 2008. 

Le site http://astoria.mslivelabs.com/ propose deux documents word qui permettent d'en savoir plus sur ce projet, il est aussi possible de télécharger le projet qui contient plusieurs projets très sympathique dont un WebSite utilisant Atlas et Astoria pour accéder aux données via JSON, cela donne vraiment envie.

Quatres Data-Service sont également accessible gratuitement à cette page : http://astoria.mslivelabs.com/OnlineService.aspx on y retrouve les classiques Northwind et AdventureWorks mais on a aussi accès au Data Service d'encarta et de Microsoft TagSpace.

En savoir plus :

Posted: jeudi 10 mai 2007 18:50 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

romagny13 a dit :

Il faut avouer que Microsoft fait fort quand même avec C# 3.0, même si entre les EDM, Linq To SQL ,etc. on ne saura plus quoi utiliser ..

# mai 10, 2007 19:52
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01