lundi 5 août 2013

Mise en place de Web API - MVC4


Bonjour à tous, aujourd’hui dans ce billet nous allons voir et appréhender une nouveauté de MVC 4 qui est les WEB API. Pour faire simple, est le WEB API de MVC4 permet principalement de faire du REST (REpresentational State Transfer) afin de piloter les données envoyées depuis différentes sources :
  1. le serveur reçoit un requête HTTP (http://mon-site.com/api/GetProducts)
  2. le serveur traite la demande (base de données, calcul etc…
  3. le serveur renvoi la requête sous forme XML/JSON au client.
Le but du WEB Api est de promouvoir un point d’entrée unique simple quelque soit le client utilisé (smarphone, tablette, PC, winform …).
Si vous pratiquez MVC vous ne serez pas dépaysez car WEB Api, est très ressemblant a MVC (“classique”). Et ce réfère a :
  • la vue : affichage des données HTML (CSS et JS)
  • le contrôleur : traitement serveur de la demande (je le considère comme le chef d’orchestre), et retourne la réponse au client.
  • le modèle : la donnée traitée par le contrôleur et renvoyées a la vue pour affichage.
Un autre fondement est les “routes” et les “actions”. Toutes les URL envoyées au serveur passe par un sas commun qui décortique l’url en action. Par exemple : http://mon-site/Produits/AfficheProduit/10 : permettra d’afficher le produits numéro 10. L’action est donc “AfficheProduit” et pointe sur le contrôleur “Produits”. Cette règle est définit dans MVC par : http://mon-site/{contrôleur}/{action}/{paramètre}

Bien. Vous avez les bases MVC pour continuer sur la partie WEB Api.

Pour WEB Api, on va supprimer la partie Vue / rendu HTML de MVC. Le rendu sera automatiquement fait en XML ou JSON (par défaut) et renvoyé au client. Coté Controller on notera que tous les WEB Api Controller héritent dès a présent de “ApiController”

Routes

Au niveau des routes par défaut WEB Api fonctionne grâce à : (WebApiConfig)
routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Je préconise de changer cet map route en prenant en compte les actions du controller (a l’instar de MVC) :
routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

De ce fait vos routes seront plus propre (surtout si vous avez beaucoup d’actions)


HTTP Method


URI Path


Action


Parameter

GET api/produits/GetProducts GetProducts (none)
GET api/produits/afficheProduit/10 AfficheProduit 10

Appel Ajax et WinForm (via webclient et Json.Net)

Quelques points remarquable :
  1. Il est préconiser de marquées les méthodes a l’aide des verbs HTTP de manière explicite [HttpGet] (Get*, Post*, Put*, Delete*)
  2. De ce fait chaque actions est appelées en précisant le verb Exemple : Ajax :
  3. $.ajax({
        type: 'POST',
        url: '/api/produits/GetProducts', …
ou depuis une winfom :

webClient.DownloadStringCompleted += (sender, e) =>
{
  try
  {
     this.userData = JsonConvert.DeserializeObject(e.Result);
  }
  catch (Exception ex)
  {
        log.Error(string.Format("Erreur lors de la récupération API - ({0}) - ", url), ex);
  }
};

webClient.DownloadStringAsync(new Uri('/api/produits/GetProducts'));

Conclusion


Pour finir ce billet, nous avons vu les prémisses de Web API. Ce qu’il faut savoir pour aller plus loin, c’est  :
  • WEB Api s’intègre très rapidement et sans problème a un site MVC (déjà en place)
  • Permet de reprendre les éléments de validation classique MVC du type – ValidationAttribute – (Required, Range, MaxLength, RegularExpression, etc …)
  • Permet de mettre en place des filtres / interceptor sur les actions (requêtes http)
  • Permet de faire des requêtes personnalisées (Iqueryable)
  • Personnalisation, il est possible d’etenre les classes pour permettre (entre autre) de s’interfacer avec de l’injection de dépendance (prochain article) Castle Windsor

Pour aller plus loin, quelques sites intéressants :

Articles en relation :
  • Injection de dépendance sur ces controller (ApiController)

Aucun commentaire:

Enregistrer un commentaire