martincho
martincho

Reputation: 4717

Properly handling nested resources in ASP.net MVC 4 WebApi routing

I'd like to provide REST API in this way:

GET /api/devices
POST /api/devices
PUT /api/devices/1
DELETE /api/devices/1

This is my configuration:

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

And these are the actions:

public IEnumerable<Device> Get()
{
//return all devices
}

public Devices Get(id)
{
//return a specific devices
}

and so on.

The issue appears when I want to handle nested resources:

GET /api/devices/1/readings
POST /api/devices/1/readings
GET /api/devices/1/readings/1
PUT /api/devices/1/readings/1
DELETE /api/devices/1/readings/1

This is my configration for these:

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

The issue shows up when trying to GET and POST to the nested resource:

[HttpGet]
public String Readings(int parentResourceId)
{
   //return a list of readings for the device
}

[HttpPost]
public String Readings(int parentResourceId)
{
    //create and return the id of a reading for the device
}

This is, of course, failing because there are two actions with the same signature.

I'd like to hear from a way of accomplishing this with the most RESTful approach

Upvotes: 13

Views: 15968

Answers (2)

There are solutions based on specifying route mappings but if you want more a more generic solution, this is by far the best solution I have seen related to this topic. Of course, Web API 2 has attribute routing.

Upvotes: 2

oeoren
oeoren

Reputation: 336

Microsoft is adding Attribute Routing to increase the flexibility of the routing system. Have a look at their documentation on Scenario 3

There is also some answers on Stack Overflow like:

How to handle hierarchical routes in ASP.NET Web API?

Upvotes: 7

Related Questions