43 votes

Contrôleur Api déclarant plus d'une déclaration Get

J'utilise le nouveau contrôleur Api dans MVC4, et j'ai trouvé un problème. Si j'ai les méthodes suivantes :

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

Cela fonctionne. Cependant, si je veux récupérer d'autres données d'un autre type, le système utilise par défaut la fonction GetAll même si la méthode $.getJSON est réglé sur le GetAllIntegers méthode :

public IEnumberable<int> GetAllIntergers()

(mauvaises conventions de dénomination)

Est-il possible pour moi de faire cela ?

Puis-je avoir une seule GetAll dans le contrôleur de l'API Web ?

Je pense que c'est plus facile de visualiser ce que j'essaie d'obtenir. Voici un extrait de code pour montrer ce que j'aimerais pouvoir faire, en une seule fois. ApiController :

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}

63voto

tpeczek Points 12722

Tout est dans le routage. La route par défaut de l'API Web ressemble à ceci :

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

Avec le modèle de routage par défaut, l'API Web utilise la méthode HTTP pour sélectionner l'action. En conséquence, une requête GET sans paramètres sera affectée à la première action de l'API. GetAll qu'il peut trouver. Pour contourner ce problème, vous devez définir une route où le nom de l'action est inclus :

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

Après cela, vous pouvez commencer à faire des demandes avec les URL suivantes :

  • api/yourapicontroller/GetClients
  • api/tourapicontroller/GetStaffMembers

De cette façon, vous pouvez avoir plusieurs GetAll dans Contrôleur.

Une autre chose importante est qu'avec ce style de routage, vous devez utiliser des attributs pour spécifier les méthodes HTTP autorisées (comme [HttpGet]).

Il est également possible de combiner le routage par défaut basé sur le verbe de l'API Web avec l'approche traditionnelle, ce qui est très bien décrit ici :

10voto

Archna Points 31

Au cas où quelqu'un d'autre serait confronté à ce problème. Voici comment je l'ai résolu. Utilisez l'attribut [Route] sur votre contrôleur pour router vers une url spécifique.

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()

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