背景
我为一个简单的博客应用程序编写了一个类似 REST 的 API 服务控制器。我使用两条路线来处理基本的 CRUD:
// Actions should handle: GET, POST, PUT, DELETE
routes.MapRoute("Api-SingleThing", "thing/{id}",
new { controller = "ThingService", action = "SingleThing" });
// Action should handle: GET
routes.MapRoute("Api-AllThings", "things",
new { controller = "ThingService", action = "AllThings" });
匹配的控制器代码如下所示:
[HttpGet]
public ActionResult AllThings() {}
[HttpGet]
[ActionName("SingleThing")]
public ActionResult Get(string id) {}
[HttpPost]
[ActionName("SingleThing")]
public JsonResult Create(Thing thing) {}
[HttpPut]
[ActionName("SingleThing")]
public ActionResult Update(Thing thing) {}
[HttpDelete]
[ActionName("SingleThing")]
public ActionResult Delete(int id) {}
该[ActionName()]
属性用于避免路由约束,因此触发时路由始终调用控制器上的“SingleThing”操作 - 无论 HTTP 动词如何。这让共享名称的控制器操作方法可以根据[HttpVerb]
属性决定谁处理请求。
在我的博客应用程序中,这就像一个魅力,但只是因为{id}
路由参数(又名 slug)始终存在,即使在POST
和PUT
请求时也是如此。
使用上面显示的这个新 API,POST
andPUT
动作不会触发顶部路由(例如,没有{id}
值),并且当它们触发第二条路由时,由于动词,没有方法来处理它们。
问题
维护这种 REST-ful URL 架构和动词处理并确保触发我的 POST 和 PUT 操作的最佳方式是什么?