1

背景

我为一个简单的博客应用程序编写了一个类似 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)始终存在,即使在POSTPUT请求时也是如此。

使用上面显示的这个新 API,POSTandPUT动作不会触发顶部路由(例如,没有{id}值),并且当它们触发第二条路由时,由于动词,没有方法来处理它们。

问题

维护这种 REST-ful URL 架构和动词处理并确保触发我的 POST 和 PUT 操作的最佳方式是什么?

4

0 回答 0