Richard A.
Richard A.

Reputation: 1157

Custom Routing with ASP.NET Web API

Suppose that I have a nested one to many-type hierarchy database as follows:

One Region has many Countries; each Country has many Cities; a City must belong to one and only one country.

Abstracting this information into a RDBMS is a trivial exercise, but (to my mind) the most sensible REST endpoint to return a list of countries for a given region id would be something like the following:

HTTP GET http://localhost/Region/3/Countries

By default, the .NET Web API's routing would be, at best, http://localhost/Countries/Region/3 or http://localhost/Region/Countries/3.

Is there a sensible naming-convention I should follow, or is the routing customisable enough to allow URIs to take any shape I like?

Upvotes: 12

Views: 20094

Answers (2)

Youssef Moussaoui
Youssef Moussaoui

Reputation: 12395

The routing should be customizable enough to get the URLs you're looking for. Assuming you want URLs in the form 'http://localhost/Region/3/Countries', you could register this custom route:

config.Routes.MapHttpRoute("MyRoute", "Region/{regionId}/Countries", new { controller = "Region", action = "GetCountries" });

This would dispatch requests to the 'GetCountries' action on the 'RegionController' class. You can have a regionId parameter on the action that gets model bound automatically for you from the URI.

You may want to look online for the attribute routing package for WebAPI since it may be more appropriate in your case.

Upvotes: 22

Joanna Derks
Joanna Derks

Reputation: 4063

Routings should be quite flexible - the question would be how you'd like to serve the data. Do you have one controller in mind or multiple?

If you had a RegionController I don't see why you couldn't configure a route:

routes.MapHttpRoute(
    name: "CountryList",
    routeTemplate: "{controller}/{regionId}/countries"
);

And a corresponding method:

public CountryCollection Get(int regionId)

Or am I missing something in your question? Where does your default routing come from?

Have a look at their documentation:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Upvotes: 3

Related Questions