Explorando el enrutamiento en la API web

ASP.Net Web API es un marco ligero que se utiliza para crear servicios HTTP sin estado. Puede utilizar la API web para diseñar e implementar servicios RESTful que se ejecutan en HTTP. REST es un estilo arquitectónico: un conjunto de restricciones que se utilizan para implementar servicios sin estado. Web API ya se ha convertido en la tecnología preferida para crear servicios HTTP ligeros. En esta publicación, presentaré una discusión sobre cómo funciona el enrutamiento en la API web.

Cuando crea un proyecto de API web en Visual Studio, observará que también se crea un proyecto MVC. Similar a ASP.Net MVC, la configuración de enrutamiento en un proyecto de API web se invoca desde el archivo Global.asax. Un proyecto de API web almacena la información de configuración en las clases RouteConfig y WebApiConfig; ambas están presentes en la carpeta Application_Start. De manera similar a un proyecto MVC, observaría un archivo RouteConfig.cs creado en la carpeta App_Start en su solución.

Un controlador en Web API es responsable de manejar las solicitudes HTTP. Los métodos públicos del controlador se conocen como métodos de acción. Tan pronto como se recibe una solicitud, el tiempo de ejecución de la API web enruta la solicitud a la acción adecuada para manejar la solicitud. Ahora, para determinar qué acción debe invocarse, el tiempo de ejecución de la API web aprovecha una tabla de enrutamiento. A diferencia de una aplicación ASP.Net MVC típica, el tiempo de ejecución de la API web enruta las solicitudes entrantes al controlador apropiado haciendo coincidir el verbo HTTP de la solicitud con el método de acción apropiado.

Con ASP.Net 5 (que se lanzará pronto como parte de Visual Studio 2015), hay un marco central unificado: tiene un marco de salida único, un marco de enlace de modelo único y una canalización de un filtro. Ahora tiene un núcleo unificado para ASP.Net MVC, ASP.Net Web API y ASP.Net Web Pages. Entonces, ahora solo hay un tipo de controlador para manejar solicitudes: es común a sus aplicaciones ASP.Net MVC, ASP.Net Web API y ASP.Net.

La plantilla de ruta MVC predeterminada se ve así:

{controller} / {action} / {id}

Por el contrario, la ruta de la API web predeterminada se ve así:

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) {}

}