Toad
Toad

Reputation: 15925

how would one route this using Asp.Net WebAPI?

I'm making a Restful service in Which I have a list of items, which could be queried as such:

 GET Api/Items

Which lists all items. But of course I'd also need these items to be listed as 'most popular', or 'belonging to user x' or 'belonging to category Y'

When glancing at the stackoverflow 2.0 api to see how they solved this they named their URLS as following:

 GET Api/Items/MostPopular

And this methodology I'd like to adopt as well as it does seem to make sense and looks good.

However, How can I configure Web-API to allow this URL syntax as well? The default route is as following:

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional }
);

So I would guess that I need to add my extra routing in front of it. I could do it like this: (If this even works)

config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/{controller}/MostPopular",
      defaults: new { id = RouteParameter.Optional }
);

But then it would add the MostPopular bit for all my controllers which I don't like.

Does something like this work?

 config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/Items/MostPopular",
      defaults: new { id = RouteParameter.Optional }
 );

And is this really the way to go as my routing table would quickly become very big and possibly unmaintainable?

Upvotes: 1

Views: 3328

Answers (2)

Silvermind
Silvermind

Reputation: 5944

Probably the best maintainable if you do not deviate from the default to much, however you should specify the controller and action in the route like this:

config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/Items/MostPopular/{id}", 
    defaults: new { controller = "wheretogo",
                    action = "wichactiontotake",
                    id = RouteParameter.Optional 
                  } 
);

or this works too:

config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/test/{action}/{id}.html",
    defaults: new { controller = "test" } 
);

Check out this link when using fake files for configurating the IIS: http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx

Upvotes: 1

Asif Mushtaq
Asif Mushtaq

Reputation: 13150

The best would be to add another get action and configure a generic route rather then a specific route.

First add action for most popular

// add action for Most Popular
[ActionName("MostPopular")]
public MyResult GetMostPopular()
{
     return null;
}

Setup route to handle the action.

// Controller with ID
// To handle routes like `/api/Items/1`
config.Routes.MapHttpRoute(
    name: "ControllerAndId",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Only integers 
);

// Controllers with Actions
// To handle routes like `/api/Items/MostPopular`
config.Routes.MapHttpRoute(
    name: "ControllerAndAction",
    routeTemplate: "api/{controller}/{action}"
);

Upvotes: 3

Related Questions