Saltar al contenido

Múltiple método HttpPost en el controlador de API web

Solución:

Puede tener varias acciones en un solo controlador.

Para eso tienes que hacer las siguientes dos cosas.

  • Primero decora acciones con ActionName atributo como

     [ActionName("route")]
     public class VTRoutingController : ApiController
     {
       [ActionName("route")]
       public MyResult PostRoute(MyRequestTemplate routingRequestTemplate)
       {
         return null;
       }
    
      [ActionName("tspRoute")]
      public MyResult PostTSPRoute(MyRequestTemplate routingRequestTemplate)
      {
         return null;
      }
    }
    
  • En segundo lugar, defina las siguientes rutas en WebApiConfig expediente.

    // Controller Only
    // To handle routes like `/api/VTRouting`
    config.Routes.MapHttpRoute(
        name: "ControllerOnly",
        routeTemplate: "api/{controller}"               
    );
    
    
    // Controller with ID
    // To handle routes like `/api/VTRouting/1`
    config.Routes.MapHttpRoute(
        name: "ControllerAndId",
        routeTemplate: "api/{controller}/{id}",
        defaults: null,
        constraints: new { id = @"^d+$" } // Only integers 
    );
    
    // Controllers with Actions
    // To handle routes like `/api/VTRouting/route`
    config.Routes.MapHttpRoute(
        name: "ControllerAndAction",
        routeTemplate: "api/{controller}/{action}"
    );
    

Una solución mucho mejor a su problema sería utilizar Route que le permite especificar la ruta en el método por anotación:

[RoutePrefix("api/VTRouting")]
public class VTRoutingController : ApiController
{
    [HttpPost]
    [Route("Route")]
    public MyResult Route(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }

    [HttpPost]
    [Route("TSPRoute")]
    public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }
}

usar:

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

ya no es un enfoque RESTful, pero ahora puede llamar a sus acciones por su nombre (en lugar de dejar que la API web determine automáticamente una según el verbo) de esta manera:

[POST] /api/VTRouting/TSPRoute

[POST] /api/VTRouting/Route

Contrariamente a la creencia popular, este enfoque no tiene nada de malo y no está abusando de la API web. Aún puede aprovechar todas las increíbles características de la API web (delegar controladores, negociación de contenido, formateadores de tipos de medios, etc.); simplemente abandone el enfoque RESTful.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *