2012-07-10 43 views
2

我正在開始一個使用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設計的錯誤方法嗎?

任何洞察力一如既往非常讚賞。

回答

3

您在帖子中提出了一些有趣的觀點。我正在爲我正在開發的一個項目面臨類似的挑戰,我的方法是在路由配置上添加一個操作參數。

隨着這種變化,我可以添加任何方法到控制器,並從客戶端調用它。這避免了爲概念上屬於相同控制器的方法指定多個控制器的需要。

奧馬爾

+0

感謝您的輸入;這幾乎是我所想的。我很好奇看看其他人是否會考慮這個問題(即它在概念上是錯誤的還是正確的);儘管在這個問題上交通似乎很輕。 – 2012-07-10 18:51:30

+0

我最終以這種方式結束了,我認爲在適當的情況下混合使用RESTful ApiController並在使用Action的情況下使用面向Action的ApiControllers是公平的。 – 2012-07-22 04:57:08