Consommation d’un service OData avec Windows Phone 7 “Mango”

Ceci est le quatrième billet d’une série sur Windows Phone 7 dans laquelle je construis une application permettant de surveiller la disponibilité de vélos des stations Vélib’ à Paris. Pour rappel, voici la table de matières:

  1. Introduction et installation des outils
  2. Création d’une application et utilisation du contrôle Bing Maps
  3. Le GPS et les services de géolocalisation
  4. Consommation d’un service OData
  5. Ajout de punaises sur une carte Bing Maps
  6. Création de nouvelles pages et navigation
  7. Création de vignettes sur la page d’accueil

OData

odataMaintenant que votre application est capable de localiser le téléphone et de centrer la carte sur sa position, il est temps de rechercher les stations Vélib’ se trouvant à proximité. Pour cela nous allons utiliser un service OData qui expose des informations sur les vélos de la ville de Paris.

Note : malheureusement, cette pratique n’est pas exactement bien vue par les fournisseurs du service, donc il est possible que dans l’avenir ces instruction ne soient plus valables.

Tout d’abord, qu’est-ce qu’OData ? Il s’agit d’un protocole ouvert pour le partage de données. Il permet d’exposer des jeux de données aux formats ATOM (XML) ou JSON se basant sur une architecture REST. Je ne rentrerai pas dans les détails, mais je vous laisserai visiter le site officiel si vous voulez en savoir plus.

J’ai choisi une source de données OData parce qu’il s’agit d’un protocole léger et facile à consommer, notamment avec l’inclusion dans les Windows Phone Developer Tools 7.1, que je vais continuer à appeler les outils “Mango”, d’un client OData.

Le client OData

Commençons donc par ajouter une référence au service OData :

Add Service Reference

Voilà, c’est fini !

Stations Vélib’ à proximité

Le client en place, il ne reste plus qu’à récupérer les stations Vélib’ à proximité de l’utilisateur.

Si vous regardez la description du service OData de près :

<FunctionImport Name="GetStationsInRectangle" EntitySet="Stations"
                ReturnType="Collection(UnVelo.Station)" m:HttpMethod="GET">
  <Parameter Name="point1" Type="Edm.String" Mode="In" />
  <Parameter Name="point2" Type="Edm.String" Mode="In" />
</FunctionImport>

Vous remarquerez la présence d’une fonction qui retourne les stations présentes dans un rectangle. Ce rectangle est défini par deux points : le coin nord-ouest et le coin sud-est.

Comme nous souhaitons récupérer la liste de stations lorsque la carte affichée change (déplacement, changement de zoom), vous allez vous abonner à l’évènement ViewChangeEnd, qui sera déclenché une fois que le déplacement ou le changement de zoom est fini :

<map:Map x:Name="Map"
    CredentialsProvider="{StaticResource BingMapsKey}"
    ZoomBarVisibility="Visible" ZoomLevel="17"
    ViewChangeEnd="OnViewChangeEnd" />

Dans le gestionnaire de l’évènement, vous allez utiliser un StationRepository qui a été créé automatiquement par Visual Studio à l’étape précédente, pour lancer un appel asynchrone sur la fonction GetStationsInRectangle.

private readonly string GetStationsInRectangleTemplate = "GetStationsInRectangle?point1='{0}'&point2='{1}'";

private GeoCoordinateWatcher _gcw;
private StationRepository _repository;

public MainPage()
{
    InitializeComponent();

    this._gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
    this._gcw.MovementThreshold = 20;
    this._gcw.PositionChanged += this.OnPositionChanged;

    this._repository = new StationRepository(new Uri("http://unvelo.fr/api/v1/"));

    this.Loaded += this.OnPageLoaded;
}

private void OnViewChangeEnd(object sender, MapEventArgs e)
{
    this._repository.BeginExecute<Station>(
        new Uri(
            string.Format(GetStationsInRectangleTemplate, Map.BoundingRectangle.Northwest, Map.BoundingRectangle.Southeast),
            UriKind.Relative),
        this.GetStationsInRectangleCallbak,
        null);
}

Le client OData créé par Visual Studio supporte uniquement les appels asynchrones dans le but d’éviter des exécutions d’appels longs sur le thread de l’interface graphique, étant donné que ceci dégraderait l’expérience utilisateur. Vous devrez donc créer une méthode callback qui sera appelée à la fin de l’exécution asynchrone pour traiter le résultat de celle-ci :

private void GetStationsInRectangleCallbak(IAsyncResult result)
{
    var stations = this._repository.EndExecute<Station>(result);
}

Vous pouvez vérifier que des stations sont effectivement retournées grâce au débuggeur de Visual Studio. Demain nous les convertirons en punaises à afficher sur la carte. D’ici là, vous avez des données avec lesquelles vous pouvez vous amuser. Si vous avez un peu d’expérience avec Silverlight ou WPF, n’hésitez pas à essayer d’afficher ces données par binding sur différents contrôles.

2 réflexions sur “Consommation d’un service OData avec Windows Phone 7 “Mango”

  1. Bonjour;
    Mon environnement est correctement configuré , Mais impossible d’ajouter la reference au service (oData) via (ajouter une reference de service), Visual Studio 2010 Ultimate me dit que le Framework ne peut lire le service..

    merci de votre aide..

    • C’est bien étrange, en effet. Je ne vois que deux explications possibles : (1) vous n’avez pas le SDK 7.1 (Mango) ou (2) la page était inaccessible quand vous avez fait vos tests. Comme vous dites que votre environnement est correctement configuré, je vous conseille de vérifier que vous pouvez accéder à la page web en dehors de Visual Studio et voir ce que ça donne.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s