OData – Introduction à l’Open Data Protocol

Salut. Comme beaucoup, une session a retenu mon attention lors des derniers techdays à Paris. Elle concerne OData, projet permettant d’exposer des données au travers de webservices en http, données identifiées par leurs URI. Jusque-là rien de bien nouveau me direz-vous ? Et bien, pas si sûr 😉

OData et Rest

OData (Open Data Protocol) est, comme son nom l’indique, un protocole d’échange de données ouvert et peut être vu comme une sorte de version avancée de REST. Pour être plus précis, c’est une spécification d’un modèle d’échange de données exposées sur le Web. Ce n’est donc pas son implémentation, cette tâche étant laissée au soin des développeurs, mais de nombreuses API existent déjà pour vous aider à exposer vos données en respectant les spécifications de OData. (Php, java, ruby, dotnet, Ios, windows mobile… et la liste est encore longue). Des outils sont également disponibles afin de vous aider dans le développement d’applications que l’on pourrait qualifier d’ « OData compliant ». Dans cet article, nous ne ferons qu’aborder la spécification d’OData et non son implémentation dans un langage particulier afin que vous puissiez, quelque soit votre langage de développement, obtenir au travers de cet article une introduction à OData.

Basiquement, OData permet de récupérer en http des données sous forme de fichiers JSON ou ATOM (xml).

Voici un exemple de requête qui pourrait être traduit par : « Affiche tous les clients dans la table Customers de la base Northwind »

http://services.odata.org/Northwind/Northwind.svc/Customers

Ou encore : « Affiche tous les clients dans la table Customers de la base Northwind où le Contact Name est égal à Maria Anders »

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=ContactName eq  ’Maria Anders’

OData et Microsoft Open Specification Promise

Le projet est en cours de normalisation via le projet Microsoft Open Specification Promise (OSP), ce qui permet aux tiers, y compris les projets open source, de construire des services de données librement en implémentant OData et donc améliorer l’interopérabilité entre les solutions Microsoft et non-Microsoft de manière bilatérale par le biais de publication de spécification. Pour plus d’information sur OSP et les travaux de Microsoft en terme de spécification de protocoles ouvert, vous pouvez vous référer à cette page : http://www.microsoft.com/interop/osp/default.mspx

La spécification complète étant disponible à cette adresse : http://msdn.microsoft.com/en-us/library/dd541188%28v=PROT.10%29.aspx

La première release est sortie début 2009 tandis que l’actuelle, en version 8.0, est sortie il y a quelques jours à peine. (11/02/2011) Voici le PDF de cette version de la spécification : http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-ODATA%5D.pdf

(les mauvaise langues pourront ainsi par la même occasion constater les efforts fait par Microsoft en terme d’interopérabilité et de contribution open source au monde de l’informatique 😉 )

Structure d’une URI Odata

(source : http://www.odata.org/images/ODataUri.png – OData Project Portail)

Comme le schéma l’indique, le format d’uri utilisé par OData est celui spécifié dans la RFC 3986

On a donc obligatoirement le schéma suivi du nom d’hôte, ensuite le port peut être précisé. Après vient la racine du service à contacter, que l’on peut décorer avec le chemin vers une ressource spécifique, enfin les options de requêtes sont placées en fin d’URI et préfixées par un ‘ ?’.

Reprenons notre exemple :

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=ContactName eq  ’Maria Anders’

–          services.forensia.com -> Host

–          Le port par défaut est ici 80

–          /ForensiaData.svc/ -> La racine du service

–          Client -> Le chemin de la ressource

–          $filter=Name eq ’Jean’ -> Les options de requêtes

La partie chemin de ressource propose beaucoup plus de possibilités, mais dans le cadre d’une introduction, ce n’est pas nécessaire de rentrer dans son détail.

Query Options

Maintenant que nous savons accéder à une collection de données, passons maintenant aux requêtes de cette collection. Cette partie de l’url définit trois types d’informations, les System Query Options, Custom Query Optionset les Services Operation Parameters. Le groupe de travail sur la spécification de OData préconise de respecter cette structure pour la construction des options de query.

System Query Option

Les SqO (pour gagner du temps), permettent de renseigner toutes les informations qu’un client pourrait donner afin de contrôler la quantité et l’ordre des données retournées par le service OData. Chacune de ces options est préfixée par ‘$’.

Faisons un bref aperçu des principales SqO

Orderby SqO

Cette SqO permet de définir une expression qui sera utilisée pour déterminer quelles valeurs détermineront l’ordre de la collection retournée par le service. Voici un exemple qui affiche tous les clients triés par nom de manière ascendante

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName asc

L’inverse :

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName desc

Et ici on trie selon le Nom puis retrié sous-séquentiellement selon l’ID

http://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=ContactName,ContactID asc

Top  SqO

Ce SqO permet d’identifier un sous ensemble, exemple où l’on récupère les 10 premiers clients :

http://services.odata.org/Northwind/Northwind.svc/Customers?$top=10

Ou encore on récupère les 10 premiers clients triés par noms.

http://services.odata.org/Northwind/Northwind.svc/Customers?$top=10&orderby=ContactName asc

Skip SqO

Skip permet d’ignorer un sous-ensemble dans la recherche, exemple ou l’on récupère tous les clients sauf les 10 premiers :

http://services.odata.org/Northwind/Northwind.svc/Customers?$skip=10

Ou encore, voici comment récupérer les clients de 20 a 30 triés par noms :

http://services.odata.org/Northwind/Northwind.svc/Customers?$skip=20&$top=10&$orderby=ContactName asc

Filter SqO

Passons enfin à celui qui sera le plus utilisé, le filtrer. Il s’écrit un peu à la manière des if en Bash. Des opérateurs logiques, arithmétiques et de groupement sont disponibles. Voici un résumé disponible sur odata.org :

 

Format SqO

Ce SqO permet de définir le type de réponse que l’on attend, à savoir Atom(atom+xml), Xml, Json ou n’importe quel type de données définies par l’IANA

Voici un exemple pour récupérer du JSON :

http://services.odata.org/Northwind/Northwind.svc/Customers?$format=json

C’est tout ?

OData propose dans sa spécification beaucoup de fonctions très utiles, nous n’avons vu ici que les principales et les plus utilisées. Pour plus d’informations et la liste complète, vous pouvez vous référer à la page http://www.odata.org/developers/protocols/uri-conventions qui contient une liste plus exhaustive des fonctions disponibles dans la spécification OData.

Service Operation Parameters

OData permet de définir des fonctions personnalisées afin d’étendre les fonctionnalités de votre data service. Ces fonctions que vous développez seront reprises dans le $metadata pour les communiquer aux développeurs utilisant votre data service, un peu à la manière d’interfaces (dans le sens Orienté Objet/Services du terme)

Et maintenant ?

Et bien maintenant vous avez tout ce qui est nécessaire afin de commencer à comprendre et requêter des données exposées implémentant OData. Par exemple Ebay, Facebook, Windows Live ou encore Stack Overflow exposent certaines de leurs données en OData. Concernant les logiciels exposant leurs données avec OData on peut citer Microsoft Sharepoint 2010, IBM WebSphere, Microsoft SQL Azure, Microsoft Dynamics CRM, GeoREST, Telerik OpenAccess ORM ou encore Telerik Sitefinity CRM.

Pour obtenir les informations plus détaillées de OData, vous pouvez vous référer au site http://www.odata.org/ qui propose une documentation à l’attention des développeurs, le site lui-même reposant dessus (le contraire aurait été choquant).

La liste des outils et des OData Producers (dans le sens producteur de données) est disponible ici : http://www.odata.org/producers

 

 

Published by Emmanuel Istace

Musician, Software developer and guitar instructor. https://emmanuelistace.be/

2 thoughts on “OData – Introduction à l’Open Data Protocol

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: