Explorer le routage dans l'API Web

L'API Web ASP.Net est une infrastructure légère utilisée pour créer des services HTTP sans état. Vous pouvez utiliser l'API Web pour concevoir et implémenter des services RESTful qui s'exécutent sur HTTP. REST est un style architectural - un ensemble de contraintes utilisées pour implémenter des services sans état. L'API Web est déjà devenue la technologie de choix pour créer des services HTTP légers. Dans cet article, je présenterai une discussion sur le fonctionnement du routage dans l'API Web.

Lorsque vous créez un projet API Web dans Visual Studio, vous observerez qu'un projet MVC est également créé. Similaire à ASP.Net MVC, la configuration de routage dans un projet d'API Web est appelée à partir du fichier Global.asax. Un projet d'API Web stocke les informations de configuration dans les classes RouteConfig et WebApiConfig - les deux sont présentes dans le dossier Application_Start. Semblable à un projet MVC, vous observeriez un fichier RouteConfig.cs créé dans le dossier App_Start de votre solution.

Un contrôleur dans l'API Web est responsable de la gestion des requêtes HTTP. Les méthodes publiques du contrôleur sont appelées méthodes d'action. Dès qu'une demande est reçue, le moteur d'exécution de l'API Web achemine la demande vers l'action appropriée pour traiter la demande. Désormais, afin de déterminer quelle action doit être appelée, le runtime de l'API Web tire parti d'une table de routage. Contrairement à une application ASP.Net MVC classique, le runtime de l'API Web achemine les demandes entrantes vers le contrôleur approprié en faisant correspondre le verbe HTTP de la demande à la méthode d'action appropriée.

Avec ASP.Net 5 (qui sera bientôt publié dans le cadre de Visual Studio 2015), il existe un cadre de base unifié - vous disposez d'un cadre de sortie unique, d'un cadre de liaison de modèle unique et d'un pipeline à un filtre. Vous disposez désormais d'un noyau unifié pour ASP.Net MVC, l'API Web ASP.Net et les pages Web ASP.Net. Il n'existe donc plus qu'un seul type de contrôleur pour gérer les demandes: il est commun à vos applications ASP.Net MVC, ASP.Net Web API et ASP.Net.

Le modèle de route MVC par défaut ressemble à ceci:

{contrôleur} / {action} / {id}

En revanche, la route API Web par défaut ressemble à ceci:

api/{controller}/{id}

The default route created when you create a new Web API project in Visual Studio looks like this:

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Note how the default route is prefixed by "api". It is a good practice to define the routes of your Web API application by prefixing them with "api" to make them distinct from the standard MVC route. On a different note, when you look at the default route for a Web API project, you wouldn't see the "{action}" route parameter -- the Web API runtime maps requests to the appropriate actions based on the HTTP verb of the requests.

However, you can modify the Web API route definition to include an "{action}" parameter. The following code snippet illustrates how the modified WebApiConfig class looks like.

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{action}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Now that you have specified "{action}" as part of the route, you need to specify the action when invoking the WebAPI method. Consider the following URL: //idgservice/authors/1

In this URL, idgservice is the name of the domain where the WebAPI has been hosted, authors is the controller name, and 1 is passed as a parameter. However, this wouldn't work if you have defined "{action}" in your route definition. You would need to explicitly mention the action name when calling your WebAPI this this case. Here's the correct URL that includes the action name as part of the URL: //idgservice/authors/GetAuthorDetails/

Note that the action name in the above URL is GetAuthorDetails and has been mentioned as part of the modified URL.

You can also specify the HTTP method for an action using the HttpGet, HttpPut, HttpPost, or HttpDelete attribute. The code snippet given below illustrates how this can be achieved:

public class AuthorsController : ApiController

{

[HttpGet]

public Author GetAuthor(id) {}

}

If you would like to allow multiple HTTP methods for an action, you can take advantage of the AcceptVerbs attribute as shown below:

public class ProductsController : ApiController

{

[AcceptVerbs("GET", "HEAD")]

public Author GetAuthor(id) { }

}

You can also override the action using the ActionName attribute as shown in the code snippet given below:

public class AuthorsController : ApiController

{

[HttpGet]

[ActionName("AuthorDetails")]

public Author GetAuthor(id) {}

}

Note that you can also prevent a method from being invoked as an action by leveraging the NonAction attribute as shown below.

public class AuthorsController : ApiController

{

[HttpGet]

[NonAction]

public Boolean ValidateLogin(id) {}

}