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
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" }
);
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 }
);