Web API路由:如何传达“api / {controller} / latest”以及“api / {controller} / {id}”

时间:2013-11-15 21:41:12

标签: asp.net asp.net-mvc asp.net-web-api

这个问题与this one非常接近,但有一点小问题。

我想设置一个Web API路由表,以便我可以发出api/items/5以及api/items/newest之类的请求,以便客户端获取最新的项目。

我一直在翻阅some articles,但在确定我是否以正确的方式解决问题方面运气不佳。

我的第一个问题是,允许来电者找到最新item的“正确”或“干净”方式是什么?可以做api/items/newest之类的事情,还是不赞同?

目前,这似乎适用于我的WebApiConfig.cs文件:

config.Routes.MapHttpRoute(
    name: "NewestItems",
    routeTemplate: "api/items/newest",
    defaults: new { controller = "Items" }
);

config.Routes.MapHttpRoute(
    name: "ItemsById",
    routeTemplate: "api/items/{id}",
    defaults: new { controller = "Items" }
);

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

这种方法有效,但我很好奇是否有一种更通用的方法来做这件事,而不需要制定特定于控制器的路由规则。我曾尝试过以下方法,但由于规则含糊不清,因此无效:

config.Routes.MapHttpRoute(
    name: "ActionWithNoArgument",
    routeTemplate: "api/{controller}/{action}",
);

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

如果不采用特定于控制器的路由规则,是否有更有效的方法来执行此操作?

谢谢你们!

1 个答案:

答案 0 :(得分:5)

config.Routes.MapHttpRoute(
    name: "NewestItems",
    routeTemplate: "api/{controller}/newest",
    defaults: new { controller = "Items" }
);

config.Routes.MapHttpRoute(
    name: "ItemsById",
    routeTemplate: "api/items/{id}",
    defaults: new { controller = "Items" }
);

路由自上而下处理,而{controller}使其成为任何控制器的通用路径