64 votes

Routage Api Web pour plusieurs méthodes Get dans ASP.NET MVC 4

Je suis à l'aide de l'Api Web avec ASP.NET MVC, et je suis très nouveau pour elle. J'ai vécu quelques démo sur asp.net site web et je suis en train de faire la suite.

J'ai 4 méthodes get, avec les signatures suivantes

public List<Customer> Get()
{
//gets all customer
}

public List<Customer> GetCustomerByCurrentMonth()
{
//gets some customer on some logic
}

public Customer GetCustomerById(string id)
{
//gets a single customer using id
}

public Customer GetCustomerByUsername(string username)
{
//gets a single customer using username
}

Pour toutes les méthodes ci-dessus, je voudrais avoir mon api web un peu comme comme indiqué ci-dessous

  • Liste Get() = api/customers/
  • Client GetCustomerById(string Id) = api/customers/13
  • Liste GetCustomerByCurrentMonth() = /customers/currentMonth
  • Client GetCustomerByUsername(string username) = /customers/customerByUsername/yasser

J'ai essayé de faire des changements de routage, mais comme je suis de nouveau à elle, pourrait pas comprendre beaucoup de choses.

Donc, s'il vous plaît peut quelqu'un m'aider à comprendre et me guide sur comment cela doit être fait. Merci

75voto

Yasser Points 9307

A partir d'ici Routing dans Asp.net Mvc 4 et Web Api

Darin Dimitrov a posté une très bonne réponse qui fonctionne pour moi.

Ça dit...

Vous pouvez avoir plusieurs itinéraires:

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "ApiById",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"^[0-9]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiByName",
            routeTemplate: "api/{controller}/{action}/{name}",
            defaults: null,
            constraints: new { name = @"^[a-z]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiByAction",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { action = "Get" }
        );
    }
}
 

49voto

Cuong Le Points 29324

Tout d’abord, ajoutez une nouvelle route avec une action en haut:

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

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

Puis utilisez l'attribut ActionName pour mapper:

 [HttpGet]
public List<Customer> Get()
{
    //gets all customer
}

[ActionName("CurrentMonth")]
public List<Customer> GetCustomerByCurrentMonth()
{
    //gets some customer on some logic
}

[ActionName("customerById")]
public Customer GetCustomerById(string id)
{
    //gets a single customer using id
}

[ActionName("customerByUsername")]
public Customer GetCustomerByUsername(string username)
{
    //gets a single customer using username
}
 

5voto

Palani Kumar Points 340

Un seul itinéraire suffit pour cela

 config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");
 

Et besoin de spécifier l'attribut HttpGet ou HttpPost dans toutes les actions.

 [HttpGet]
public IEnumerable<object> TestGet1()
{
    return new string[] { "value1", "value2" };
}

[HttpGet]
public IEnumerable<object> TestGet2()
{
    return new string[] { "value3", "value4" };
}
 

0voto

Murtuza Kabul Points 5166

Vous n'aurez peut-être pas besoin de modifier le routage. Ajoutez simplement les quatre méthodes suivantes dans votre fichier customersController.cs:

 public ActionResult Index()
{
}

public ActionResult currentMonth()
{
}

public ActionResult customerById(int id)
{
}


public ActionResult customerByUsername(string userName)
{
}
 

Mettez le code approprié dans la méthode. Avec le routage par défaut fourni, vous devriez obtenir le résultat d’action approprié du contrôleur en fonction de l’action et des paramètres de vos URL.

Modifiez votre itinéraire par défaut comme suit:

 routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Api", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X