ASP.NET WebApi - Multiple GET actions in one controller

后端 未结 2 1914
忘了有多久
忘了有多久 2021-02-05 08:20

I have Users controller and basic REST pattern is working just fine. However I need one additional pattern users/{id}/usergroups that will return all u

相关标签:
2条回答
  • 2021-02-05 08:45

    I'm stuck using Web API v1 and came up w/ the following solution to this. For all of your general routes, declare the ActionName as "Default". Then in your route config, set the default action="Default". This changes your call to /Users/5 to users/5/default and ensures it maps to the right place. The only problem I've found w/ this solution is that the documentation will show the /Default part of the route. It looks like you can edit your view to exclude these as this guy did (https://stackoverflow.com/a/29353198/4374666).

    If you're using v2, it seems like Attribute Routing would be the cleanest way.

    // GET api/Users/5
    [HttpGet, ActionName("Default")]
    public User GetUser(int id) // THIS STILL DOES NOT WORK
    
    // GET api/Users/5/UserGroups
    [HttpGet, ActionName("usergroups")]
    public IEnumerable<UserGroup> GetUserGroups(int id) // THIS WORKS
    
    // ROUTES
    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}/{action}",
        defaults: new { id = RouteParameter.Optional,
     action = "Default" }
    );
    
    0 讨论(0)
  • 2021-02-05 09:09

    You can either: just define one Get method, and have an optional Id Parameter like this:

    public IEnumerable<User> GetUsers(int? id){
        if (id.HasValue)
        {
             //return collection of one item here
        }
        //return collection of all items here
    }
    

    Or you can have multiple Gets decorated with the ActionName Attribute

    // GET api/Users
    [ActionName("GetAll")]
    public IEnumerable<User> GetUsers()
    
    // GET api/Users/5
    [ActionName("Get")]
    public User GetUser(int id) // THIS IS NO LONGER IN CONFLICT
    

    And then define the routes on your RouteConfig like so:

    routes.MapHttpRoute(
                name: "DefaultApiWithAction",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );
    
    0 讨论(0)
提交回复
热议问题