La recherche avec WebAPI
J'ai fait une API web de classe pour mon Customer
modèle. J'ai les méthodes standard (GET, POST, PUT, DELETE). Le problème c'est que je veux mettre en œuvre une autre méthode GET qui est une recherche. Quelque chose comme ceci:
[HttpGet]
public IEnumerable<Customer> Search(string id)
{
var customers = customerRepository.Search(id);
return customers;
}
La méthode de recherche effectue une recherche basée sur le numéro de compte de mes clients, en utilisant les .Contains()
méthode.
Le problème c'est que quand je navigue à: mySite.com/api/Customers/Search/123
j'obtiens une erreur 404. Ce que je fais mal?
OriginalL'auteur CallumVass | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
Que par la route par défaut de l'installation uniquement le contrôleur standard des noms d'action sont autorisés (le repos et l'expédition est faite en se basant sur le verbe HTTP). Si vous voulez violer le repos de conventions et d'utiliser certaines personnalisé des noms d'action, alors vous devrez modifier votre configuration de l'itinéraire afin d'inclure le nom de l'action dans l'url:
api/{controller}/{action}/{id}
. Maintenant, vous pouvez envoyer une demande d'/api/Customers/Search/123
qui va invoquer l'action de Recherche sur les Clients de l'API contrôleur.Vous créez un autre contrôleur: SearchProductsContoller ou quoi que ce soit et ensuite utiliser le trouver à l'intérieur.
Ahh.. juste comme je le pensais, c'est que ce qui serait normalement se passer ensuite? Un nouveau contrôleur pour chaque requête GET, vous pouvez avoir besoin?
C'est un contrôleur pour chaque ressource. Dans le RESTE de nous référer à des entités comme des ressources.
Comment voulez-vous mettre en œuvre la recherche si vous avez besoin d'accepter un type complexe comme un argument au lieu d'une chaîne à l'aide de l'OBTENIR? c'est à dire "public IEnumerable<Client> Recherche(SeachFilter filtre)"
OriginalL'auteur
Tout Darin réponses sont toujours de qualité supérieure à cette question serait effectivement bénéficier d'une réponse qui explique la façon dont la recherche, d'échange et de filtrage doit être fait dans n'importe quel API et comment il devrait être fait à l'aide de la version la plus actuelle de l'API Web (v2).
C'est un post que je considère comme une bonne ressource sur la question (technologie indenpendent):
http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
La réponse devrait également tenir compte de ce qui est nouveau dans ASP.NET Web API v2 parce Darin la réponse est assez vieux.
Puisque cette question revient à le haut en faisant des recherche sur Google pour "asp.net l'api web à la recherche" je vais essayer d'expliquer quelques petites choses ici.
De se rapprocher autant que possible de se REPOSER principes avec la dernière version de ASP.NET l'API Web (v2), on doit prendre un air sérieux à l'attribut de routage qui a été introduit dans la dernière version. Il est très difficile de parvenir à Reposante de routage avec l'ancien, classique, de la convention en fonction de routage (en global.asax.cs ou RouteConfig.cs).
Vous devriez lire plus à ce sujet ici
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Maintenant, d'aller dans les détails de la façon de mettre en œuvre les spécificités que vous vous posez sur.
La pratique la plus courante consiste à exposer ces types de fonctionnalités par le biais des paramètres de chaîne de requête.
Par REPOS principes, vous devriez avoir un point de terminaison pour vos Clients de la ressource, par exemple
Pour réaliser cela, vous devez décorer votre GetCustomers() dans votre site Web API contrôleur comme ce
Vous mise en œuvre de cette action au plus près de ce que vous avez fait dans le classique MVC si vous voulait fournir des Vues filtrées.
Je voudrais vous présenter de nouveaux contrôleurs et actions personnalisées si vraiment nécessaire, pour quelques cas limites.
en ce qui concerne un commentaire à propos de SearchFilter objet fortement typé, il faut expliquer que cela ne peut pas fonctionner hors de la boîte, car le classeur de modèles par défaut de ne pas se lier à cette classe lors de l'utilisation de requêtes GET.
Alors j'aimerais prendre ces propriétés à partir de SearchFilter de classe et de les mettre sur l'action elle-même, pour qu'ils puissent se lier via la chaîne de requête de classeur ou de l'utilisation de la
[FromBody]
classeur si vous voulais lier à partir du corps de la requête. Comme par http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-apiHTH
OriginalL'auteur