13

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

1

2 Answers 2

7

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?

Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.