我正在開始一個使用ASP.NET MVC4和Visual Studio 2012的新項目。在API設計方面,大多數示例都關注基於實體上的PUT,GET,POST和DELETE動詞的基本CRUD操作(如您所期望的)。我讀了以下情況:如何在MVC4的Web API中設計非CRUD操作?
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
文章表明,如果我選擇映射爲
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{action}",
defaults: new { action = RouteParameter.Optional }
);
這更多的是一個RPC樣式的方法的途徑;我從中推斷他們推薦兩條路線兩個控制器分裂每個操作:
也許類似的母公司CRUD:
routes.MapHttpRoute(
name: "Parent",
routeTemplate: "api/{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional }
);
和子實體CRUD:
routes.MapHttpRoute(
name: "Child",
routeTemplate: "api/user/{id}/{controller}",
defaults: new { id = RouteParameter.Optional }
);
從數據/粗暴的角度來看,這是完全合理的。但是,當您想要對實體執行非粗暴操作(即,/User/NoahBawdy/SignIn
或/User/NoahBawdy/ChangePassword
)時,該怎麼辦?我可以看到這些是PUT或POST動作,但它確實需要它自己的控制器嗎?這是對這些類型的操作進行API設計的錯誤方法嗎?
任何洞察力一如既往非常讚賞。
感謝您的輸入;這幾乎是我所想的。我很好奇看看其他人是否會考慮這個問題(即它在概念上是錯誤的還是正確的);儘管在這個問題上交通似乎很輕。 – 2012-07-10 18:51:30
我最終以這種方式結束了,我認爲在適當的情況下混合使用RESTful ApiController並在使用Action的情況下使用面向Action的ApiControllers是公平的。 – 2012-07-22 04:57:08