Buscar..


Cómo funciona el enrutamiento en asp.net webapi

En la API web de ASP.NET, un controlador es una clase que maneja solicitudes HTTP. Los métodos públicos del controlador se denominan métodos de acción o simplemente acciones.

Cuando el marco de la API web recibe una solicitud, enruta la solicitud a una acción. Para determinar qué acción invocar, el marco utiliza una tabla de enrutamiento. La plantilla de proyecto de Visual Studio para la API web crea una ruta predeterminada:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "**api/{controller}/{id}**",
    defaults: new { id = RouteParameter.Optional }
);

Esta ruta se define en el archivo WebApiConfig.cs, que se coloca en el directorio App_Start: introduzca la descripción de la imagen aquí

Cada entrada en la tabla de enrutamiento contiene una plantilla de ruta. La plantilla de ruta predeterminada para la API web es " api / {controller} / {id} ". En esta plantilla, " api " es un segmento de ruta literal, y { controller } y { id } son variables de marcador de posición.

Cuando el marco de la API web recibe una solicitud HTTP, intenta hacer coincidir el URI con una de las plantillas de ruta en la tabla de enrutamiento. Si ninguna ruta coincide, el cliente recibe un error 404.

Por ejemplo, los siguientes URI coinciden con la ruta predeterminada:

  • / api / valores
  • / api / valores / 1

Sin embargo, la siguiente URI no coincide, porque carece del segmento " api ":

  • / valores / 1

Una vez que se encuentra una ruta coincidente, la API web selecciona el controlador y la acción:

  • Para encontrar el controlador, la API web agrega "Controlador" al valor de la variable {controlador}.
  • Para encontrar la acción, la API web examina el método HTTP y luego busca una acción cuyo nombre comience con el nombre de ese método HTTP. Por ejemplo, con una solicitud GET, la API web busca una acción que comience con "Obtener ...", como "GetEmployee" o "GetAllEmployees". Esta convención se aplica solo a los métodos GET, POST, PUT y DELETE.

Puede habilitar otros métodos HTTP usando atributos en su controlador. Veremos un ejemplo de eso más tarde.

  • Otras variables de marcador de posición en la plantilla de ruta, como {id}, se asignan a parámetros de acción.

Métodos HTTP En lugar de utilizar la convención de nomenclatura para los métodos HTTP, puede especificar explícitamente el método HTTP para una acción decorando el método de acción con los atributos HttpGet, HttpPut, HttpPost o HttpDelete.

En el siguiente ejemplo, el método EmployeeGetEmployee se asigna a las solicitudes GET:

 public class EmployeesController : ApiController
    {
        [HttpGet]
        public EmployeeGetEmployee(id) {}
    }   

Para permitir múltiples métodos HTTP para una acción, o para permitir métodos HTTP distintos de GET, PUT, POST y DELETE, use el atributo AcceptVerbs, que toma una lista de métodos HTTP.

public class EmployeesController: ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Employee GetEmployee (id) { }
}

Enrutamiento por nombre de acción

Con la plantilla de enrutamiento predeterminada, la API web utiliza el método HTTP para seleccionar la acción. Sin embargo, también puede crear una ruta donde el nombre de la acción se incluya en el URI:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

En esta plantilla de ruta, el parámetro {acción} nombra el método de acción en el controlador. Con este estilo de enrutamiento, use atributos para especificar los métodos HTTP permitidos. Por ejemplo, supongamos que su controlador tiene el siguiente método:

public class EmployeesController: ApiController
{
    [HttpGet]
    public List<Employee> GetAllEmployees();
}

En este caso, una solicitud GET para " api / Employees / GetAllEmployees " se asignaría al método GetAllEmployees.

Puede anular el nombre de la acción utilizando el atributo ActionName. En el siguiente ejemplo, hay dos acciones que se asignan a " api / Employees / ShowAllEmployees / id . Una es compatible con GET y la otra con POST:

public class EmployeesController : ApiController
{
    [HttpGet]
    [ActionName("ShowAllEmployees")]
    public List<Employee> GetAll(int id);

    [HttpPost]
    [ActionName("ShowAllEmployees")]
    public void GetAll (int id);

}

No-acciones

Podemos evitar que un método sea invocado como una acción usando el atributo NonAction. Esto indica al marco que el método no es una acción, incluso si de otro modo coincidiría con las reglas de enrutamiento.

 [NonAction]  
public string GetValues() { ... }

Ejemplos de enrutamiento basados ​​en verbos.

La misma URl para diferentes métodos http actúa de manera diferente. A continuación se muestra una tabla que muestra lo mismo.

HTTP VERBO URL DESCRIPCIÓN
OBTENER / api / estudiantes Devuelve todos los estudiantes
OBTENER / api / estudiantes / 5 Detalles de devoluciones de ID de estudiante = 5
ENVIAR / api / estudiantes Agregar un nuevo estudiante
PONER / api / estudiantes / 5 Actualizar estudiante con Id = 5
BORRAR / api / estudiantes / 5 Eliminar estudiante con Id = 5


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow