WebApi l'ajout d'une autre Méthode Get
J'ai un assez standard WebApi qui fait de base des opérations CRUD.
Je suis en train d'ajouter quelques différents types de recherches, mais je suis pas tout à fait sûr de savoir comment c'est supposé être fait.
Voici mon FoldersController actuellement
public class FoldersController : ApiBaseController
{
//using ninject to pass the unit of work in
public FoldersController(IApiUnitOfWork uow)
{
Uow = uow;
}
//GET api/folders
[HttpGet]
public IEnumerable<Folder> Get()
{
return Uow.Folders.GetAll();
}
//GET api/folders/5
public Folder Get(int id)
{
return Uow.Folders.GetById(id);
}
//POST api/folders
public HttpResponseMessage Post(Folder folder)
{
Uow.Folders.Add(folder);
Uow.Commit();
var response = Request.CreateResponse(HttpStatusCode.Created, folder);
//Compose location header that tells how to get this Folder
response.Headers.Location = new Uri(Url.Link(WebApiConfig.DefaultRoute, new { id = folder.Id }));
return response;
}
//PUT api/folders
public HttpResponseMessage Put(Folder folder)
{
Uow.Folders.Update(folder);
Uow.Commit();
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
//DELETE api/folders/5
public HttpResponseMessage Delete(int id)
{
Uow.Folders.Delete(id);
Uow.Commit();
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
}
ce que je voudrais faire est d'ajouter une méthode qui ressemble à quelque chose comme ceci
public IEnumerable<Folder> GetChildFolders(int folderID)
{
return Uow.Folders.GetChildren(folderID);
}
Puisque j'ai déjà la norme Get en là, je ne suis pas tout à fait sûr de savoir comment le faire.
J'ai d'abord pensé que je pourrais juste ajouter une nouvelle route..quelque chose comme
routes.MapHttpRoute(
name: "ActionAndIdRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { id = @"^/d+$" } //only numbers for id
);
Et la juste ajouter quelque chose comme un ActionName annotation ma méthode [ActionName("GetChildren")]
mais qui ne l'a pas volée.
Suis-je sur la bonne voie? Comment puis-je faire quelque chose comme ça, sans l'ajout d'un autre contrôleur?
OriginalL'auteur Kyle Gobel | 2013-05-16
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ne pas aimer cette réponse, mais je pense que c'est la bonne. WebAPI a été conçu pour ne disposez que de 5 appels (un élément /les éléments de la liste), POST, PUT et DELETE par type d'entité. Cela permet pour le REPOS Url, telles que les Dossiers/Obtenir/5, des Dossiers/Get etc.
Maintenant, dans votre scénario, vous êtes désireux ChildFolders, ce que je peux comprendre ne sont pas des objets différents, mais ils sont des entités différentes en termes de REPOS (ChildFolders/Get) etc. Je pense que ça pourrait être un autre WebAPI contrôleur.
Y a des façons de colmatage de la Http Routes à gérer, mais je ne pense pas qu'il comment API Web a été conçu pour fonctionner et qu'il accepte de vous suivre RESTE des données par entité-type de protocoles... sinon pourquoi ne pas simplement utiliser .NET MVC Contrôleurs pour vos appels AJAX?
Je dirais que prend tout son sens à l'utilisation WebAPI, yup! Cependant, avez-vous vérifié MVC 6 encore? Les contrôleurs et WebAPI sont l'un des la même, donc il n'y a pas de différence entre les deux.
Je vais utiliser des Contrôleurs MVC pour créer le RESTE de l'API au lieu d'utiliser un WebAPI projet.
OriginalL'auteur Chris Dixon
L'idée derrière WebAPI est à suivre de REPOS, comme l'a dit Chris. Avec cela à l'esprit, c'est à vous de décider comment vos cartes de domaine à ce modèle. Si l'enfant-dossiers sont dossiers, et utiliser la même logique interne, alors peut-être il a le sens parfait pour mettre dans votre FoldersController. Si non, ou si vous souhaitez effectuer tout le RESTE des méthodes sur des dossiers enfant, il peut faire plus de sens de créer un ChildFoldersController.
Maintenant que votre application est organisée intelligemment, vous pouvez penser de routage. WebAPI prend désormais en charge l'attribut de routage. Si vous ajoutez cette ligne à votre WebApiConfig.Registre --
config.MapHttpAttributeRoutes();
-- comme suit:Vous pouvez ensuite mettre votre itinéraire sur l'action elle-même:
Maintenant, tous vos appels RESTE à la voie "dossiers/{id de dossier}" fonctionne à l'aide de l'itinéraire par défaut, alors que tout est sur cette route que les include "/les enfants" sera frappé de cette action. Il fait également appel du comportement très clair à l'appelant de votre API.
Vous pouvez également le faire à la normale du modèle de routage:
Vous pouvez également laisser des contrôleurs en tant que variable dans cet itinéraire personnalisé, si vous avez d'autres ressources que d'avoir des enfants, et vous pouvez toujours mettre de l'action dans un autre contrôleur qui gère également les appels à la route "childFolders/{id de dossier}".
De routage très flexible. Assurez-vous de les concevoir de telle sorte qu'elle donne un sens à un coup d'œil pour le api appelants et les gens de la maintenance de votre logiciel (y compris vous).
Voici quelques attribut de routage info: Attribut de Routage dans WebAPI 2
OriginalL'auteur Madeline Trotter
Une façon est d'écrire un nouvel itinéraire spécifique à la
GetChildFolders
action.OriginalL'auteur Maggie Ying
Actions sont un bon moyen de deux méthodes Get à l'intérieur d'un WebApi contrôleur.
Voici ce que je fais pour avoir des actions différentes, et également une option ID de paramètre pour certaines actions:
À l'intérieur de
WebApiConfig.cs
j'ai le texte suivant:et dans le contrôleur:
[ActionName("DefaultAction")]
annotation n'est pas obligatoire.OriginalL'auteur Liel
Faire vos itinéraires comme suit:
Vous pouvez alors avoir des méthodes telles que
Qui vous pouvez appeler avec
/api/folders/getchildren/123
.Assurez-vous que la valeur du paramètre de la méthode est l'id de dossier, plutôt que par id.
OriginalL'auteur Jon Susiak