我想以这种方式提供REST API:
GET /api/devices
POST /api/devices
PUT /api/devices/1
DELETE /api/devices/1
这是我的配置:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这些是行动:
public IEnumerable<Device> Get()
{
//return all devices
}
public Devices Get(id)
{
//return a specific devices
}
等等。
当我想处理嵌套资源时会出现问题:
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
这是我对这些人的同意:
config.Routes.MapHttpRoute(
name: "NestedApi",
routeTemplate: "api/{controller}/{parentResourceId}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
尝试对嵌套资源进行GET和POST时会出现此问题:
[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
}
这当然是失败的,因为有两个行为具有相同的签名。
我希望通过最RESTful方法来实现这一目标
答案 0 :(得分:5)
Microsoft正在添加属性路由以增加路由系统的灵活性。 在场景3中查看their documentation
Stack Overflow上也有一些答案,如:
答案 1 :(得分:2)
有些解决方案基于指定路由映射,但如果您想要更多更通用的解决方案,this是迄今为止我看到的与此主题相关的最佳解决方案。当然,Web API 2具有属性路由。