2012-07-12 184 views
1

在我最初創建一個MVC4 Web API。我注意到路線的處理方式似乎有點不同:MVC 4 Web API的路線?

  • 控制器不再有超過4個動作?
  • 只支持一個HTTP動詞的資源仍然是它自己的控制器?
  • 路由層次往往非常平坦,或者與人類的MVC應用相比,必須指定/維護大量的路由。

我已經創建了相當大的網站,只使用兩條或三條路線,但我只是開始使用我的API,而我達到了將近一打。我認爲API本質上可以讓自己更深入的網址,而不是網站,但這似乎有點過分。

我覺得我錯過了某處的命名空間或路由約定。我幾乎將所有這些歸因於動作名稱不再是路由的一部分,只是HTTP方法。有沒有辦法通過參數匹配,控制器名稱和HTTP方法以外的任何其他方式來支持路由?

+0

* 4動作+重載假設GET/PUT/POST/DELETE ... – Paul 2012-07-12 19:56:35

回答

4

您可以在Global.asax中修改路由。默認設置爲:

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

但你可以改變它,例如使用動作名稱:在MVC的Web API看看這個article

routes.MapHttpRoute(
name: "ActionApi", 
routeTemplate: "api/{controller}/{action}/{id}", 
defaults: new { id = RouteParameter.Optional } 

欲瞭解更多有關自定義路由。根據意見

以上

更新是問題的答案,「我可以改變路由?」簡短的回答是肯定的,但正如您在其他答案中指出的那樣,您可能不希望維護良好的REST API。帶有默認路由的MVC Web API維護着您正在處理資源的基本REST概念,其中控制器代表資源。在您的其他問題你給的例子:你在哪裏希望在帳戶1234刪除便箋在這種情況下

DELETE /account/1234/note/321 <- delete note 321 on account 1234 

您正在使用的資源是一個音符。這方面的一個更好的表示是使用查詢字符串,所以你這個例子API應該是這樣的:

DELETE /note/321?account=1234 <- delete note 321 on account 1234 

這樣,你不需要亂用路由和很明顯,資源正在採取行動是使用過濾器的筆記。但是我還會質疑,如果note的id對於整個應用程序而言是唯一的,而不僅僅是針對特定帳戶,那麼是否需要添加此顯式過濾器(即where子句)。

+1

感謝這裏的補充,這是我實際嘗試編寫的第一個REST API,並且仍處於「REST與HTTP之外的SOAP類似」階段,並且很適合它。在我的另一個問題中,'note'的ID是全球唯一的,所以我想放棄賬號#。我仍然覺得,如果我有一個帳戶和一個帳戶註釋,那麼使用「/ account/note/123」在語義上不僅僅是「/ note/123」來表示資源。在MVC4中,創建這種嵌套似乎並不是一個好方法,而不會創建一堆維護路線。 – Paul 2012-07-13 01:05:52

+1

@Paul使用任何URL結構可以輕鬆地爲框架工作。 '/ note/123'沒有問題如果你真的想清楚它是一個賬戶註釋,那麼可以使用'/ accountnote/123'。網址只是標識符,不要超越自己的結構。 – 2012-07-13 02:54:34

+1

我同意@DarrelMiller對他的建議。 Apigee [http://apigee.com/about/resources]的人員是設計API的一個很好的資源。他們有一些關於開發RESTful API的免費視頻和電子書。 – 2012-07-13 12:56:11

1

Web API是爲RESTFull服務設計和定製的,將控制器視爲服務名稱。按照慣例,GET/PUT/POST/DELETE被映射到控制器動作,其名稱包含動詞。

如果你不想做一些RESTFULL,那麼我會使用HTTPController來代替。正如您可能注意到的,您可以將它們混合到具有不同路線的同一個項目中。

+0

我想創建一個,雖然這是我第一個真正的RESTful API。也許我的網址結構不正確:/ customer/1234/premise/456/note/789。幾天前我問了這個問題,雖然我沒有真正得到滿意的答案:http://stackoverflow.com/questions/11266108/rest-url-id-placement-for-resources-with-collections/11266306#comment14812617_11266306 – Paul 2012-07-12 20:27:14

+1

Web API是爲基於HTTP的API量身定做的。您可以使用Web API構建RESTful系統,並且可以構建非REST HTTP apis。 Web API中沒有任何東西將您推向REST方向。 – 2012-07-13 02:08:45