Utilisation d’une API Web avec ASP.NET MVC 3

Dans ce billet, nous allons voir quelles sont les √©tapes √† suivre pour utiliser une API Web WCF au sein d’une application MVC. Tout d’abord, cr√©ons un projet de type Application Web ASP.NET MVC3 que l’on va appeler ArtistManager.

On sélectionne le modèle vide et on conserve le moteur de vue Razor.

Une fois le projet créé, on effectue un clic-droit → Propriétés → Web. Dans la partie Serveurs, on indique un port spécifique (Exemple : 1402).

La prochaine √©tape consiste √† installer un paquet de cr√©ation d’API Web par l’interm√©diaire de NuGet.

 

NB¬†: Si vous n’avez toujours pas install√© NuGet sur votre machine, je vous sugg√®re de lire ce tutoriel d’Hinault Romaric DONFACK qui d√©taille toutes les informations relatives √† ce sujet.

 

Pour cela, nous allons cliquer sur Outils ‚Üí Library Package Manager ‚Üí Add Library Package Reference, rechercher le paquet WebApi.All, et l’installer.

Une fois l’installation effectu√©e, vous pouvez remarquer que des r√©f√©rences ont √©t√© ajout√©es √† votre projet.

Nous sommes d√©sormais pr√™t √† construire notre API Web.¬†Dans un premier temps, nous allons cr√©er un dossier API qui contiendra nos classes API. Au sein de ce dossier, nous allons ajouter une nouvelle classe API que l’on va appel√©e ArtistApi. A ce stade, vous devriez avoir ce code dans votre classe¬†:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ArtistManager.API
{
    public class ArtisteApi
    {
    }
}

On va la modifier en y ajoutant l’attribut ServiceContract afin d’indiquer √† l’API Web que cette classe peut √™tre expos√©e en tant que service. Cet attribut n√©cessite l’espace de noms System.ServiceModel.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel;

namespace ArtistManager.API
{
    [ServiceContract]
    public class ArtistApi
    {
    }
}

Maintenant, nous allons enregistrer dans le fichier Global.asax.cs. Ajoutez les espaces de noms suivants :

using ContactManager.APIs;
using System.ServiceModel.Activation;

Dans la m√©thode RegisterRoutes, il va falloir ajouter le bout de code suivant afin d’enregistrer une route pour notre nouvel API Web¬†:

routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory(), typeof(ArtistApi)));

 

Vous devriez avoir :

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory(), typeof(ArtistApi)));

            routes.MapRoute(
                "Default", // Nom d'itinéraire
                "{controller}/{action}/{id}", // URL avec des paramètres
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Paramètres par défaut
            );
        }

La classe ServiceRoute permet de cr√©er un itin√©raire de service sur HTTP pour la prise en charge de sc√©narios REST. Elle prend 3 param√®tres¬†: un pr√©fix d’itin√©raire, une instance de classe HttpServiceHostFactory et un type de service.

 

Nous allons impl√©menter une classe POCO Artiste qui contiendra les informations qui seront pass√©s via l’API. Il s’agit essentiellement d’un DTO (Data Transfer Object) mais en HTTP on consid√®re que cette entit√© est repr√©sent√©e par une ¬ę¬†Ressource¬†¬Ľ. Nous cr√©erons √©galement une m√©thode qui exposera notre ressource. Cela permettra √† de multiples clients d’acc√©der √† la ressource.

 

Comme fait pr√©c√©demment, on va cr√©er un dossier Ressources qui contiendra l’ensemble de nos ressources et y ajouter une classe Artist contenant le code suivant¬†:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ArtistManager.Ressources
{
    public class Artist
    {
        public int ArtistId { get; set; }
        public string Name { get; set; }
    }
}

Dans la classe ArtistApi, il va falloir ajouter les espaces de noms suivants :

using System.ServiceModel.Web;
using ArtistManager.Ressources;

Ainsi que la méthode Get suivante permettant de rapatrier les artistes :

[WebGet(UriTemplate = "")]
        public IEnumerable<Artist> Get()
        {
            var artists = new List<Artist>()
            {
                new Artist {ArtistId = 1, Name = "Richard Anconina"},
                new Artist {ArtistId = 2, Name = "Bruno Solo"},
                new Artist {ArtistId = 3, Name = "José Garcia"},
                new Artist {ArtistId = 4, Name = "Gilbert Melki"},
                new Artist {ArtistId = 5, Name = "Vincent Elbaz"}
            };
            return artists;
        }

Ici, l’attribut WebGet indique √† l’API Web que cette m√©thode doit √™tre expos√©e en tant que requ√™te HTTP GET. On prend soin de passer une cha√ģne vide √† l’UriTemplate. En effet, nous avons d√©j√† d√©finit la route de notre URL dans le Global.asax. D’ailleurs, vous pouvez v√©rifier que tout fonctionne et que votre liste d’artistes vous est renvoy√©e en vous rendant √† l’URL suivante¬†: http://localhost:1402/api/artists

Afin de tester leurs fonctionnalit√©s, les Web API contiennent un module de test c√īt√© client que l’on peut configurer en cr√©ant une instance de HttpConfiguration dans la m√©thode RegisterRoutes¬†:

var config = new HttpConfiguration() { EnableTestClient = true };

Il faudra ensuite passer cette instance au HttpServiceHostFactory de la route du Web API que nous avions créé précédemment.

routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory() { Configuration = config }, typeof(ArtistApi)));

On relance le projet, puis on se rend √† l’URL suivante¬†: http://localhost:1402/api/artists/test

Ce qui nous amène sur la page de test.

Lorsque l’on clique sur notre ressource, cela a pour effet de remplir les champs Request et HTTP/1.1

On clique sur le bouton Send pour afficher la réponse de la requête GET :

 

On peut √©galement r√©cup√©rer la liste des Artistes au format JSON en passant la valeur ¬ę¬†application/json¬†¬Ľ au param√®tre Accept du champ Header¬†:

 

Pour marque-pages : permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>