web-dev-qa-db-fra.com

Contrôleur API déclarant plusieurs instructions Get

Utilisation du 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 fonctionnera. Cependant, si je veux récupérer des données différentes d'un type différent, il s'agit par défaut de la méthode GetAll, même si $.getJSON Est défini sur la méthode GetAllIntegers:

public IEnumberable<int> GetAllIntergers()

(mauvaises conventions de dénomination)

Est-il possible pour moi de pouvoir faire cela?

Puis-je avoir une seule méthode GetAll dans le contrôleur API Web?

Je pense qu'il est plus facile de visualiser ce que j'essaie de réaliser. Voici un extrait de code pour montrer ce que j'aimerais pouvoir faire, en un seul 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
}
42
Neil Knight

C'est tout 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, il mappera une requête GET sans paramètres sur le premier GetAll qu'il pourra trouver. Pour contourner ce problème, vous devez définir un itinéraire dans lequel 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/yourapicontroller/GetStaffMembers

De cette façon, vous pouvez avoir plusieurs GetAll dans Controller.

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

Il existe également une option de mélange du routage basé sur les verbes de l'API Web par défaut avec une approche traditionnelle, il est très bien décrit ici:

63
tpeczek

Au cas où quelqu'un d'autre serait confronté à ce problème. Voici comment j'ai résolu cela. 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()
9
Archna