2012-08-23 72 views
2

我有一個用ASP.NET MVC 4框架編寫的web服務。它的基本CRUD操作很好地映射到REST動詞,但是我有一個操作,我需要添加一個操作。ASP.NET MVC 4 - API路由 - 在URL中指定動作

什麼是正確的方式來指定有時在URL的末尾傳遞一個ID的能力,你知道它是一個整數類型,有時候它是一個「動作」一個字符串類型,後跟一個斜槓和一個int ID?需要正確的路由器映射幫助。

想法?注意:我更關注WebAPI,然後是100%REST。

例如網址
//獲取小部件的列表
http://somedomain.com/api/widget
//獲取特定部件
http://somedomain.com/api/widget/1
// POST - 採取專項行動對特定的部件 - 促進
http://somedomain.com/api/widget/promote/1

會這是處理它的正確方法?

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

     routes.MapHttpRoute( 
      name: "DefaultApiExtended", 
      routeTemplate: "api/{controller}/{action}/{id}" 
     ); 

回答

5

我想嘗試把第二圖案(一個「行動」 String類型後跟斜槓和一個int ID)在更高的優先級比(在的端部傳遞的ID你知道的URL將是一個Integer類型)

routes.MapHttpRoute(
      name: "ActionWithId", 
      routeTemplate: "api/widget/{action}/{id}" 
     ); 

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

你的行動,你的ID是不可選的,因爲你總是希望他們。如果沒有匹配,則DefaultApi規則應該接管處理。

編輯:

只是想,如果你希望它是「RESTy」,那麼你可以隨時切換ID,所以對於這個小工具,有了這個ID,執行此操作。在http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

routes.MapHttpRoute(
     name: "ActionWithId", 
     routeTemplate: "api/widget/{id}/{action}" 
    ); 
4

看看 - 「通過行動名稱路由」 專節

http://somedomain.com/api/widget/promote/1 recomended要 http://somedomain.com/api/widgets/1/promote

稍有變化(使用複數,如果可能的部件* S *)

您的控制器將需要如下所示:

public class WidgetsController : ApiController 
{ 
    [HttpPost] 
    /// POST api/widgets/1/promote 
    public void Promote(int id) 
    { 

    } 

    // GET api/widgets/1 
    public string Get(int id) 
    { 
     return "value"; 
    } 

} 

而且路線:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

     routes.MapHttpRoute(
      name: "DefaultPromoteActionApi", 
      routeTemplate: "api/{controller}/{id}/{action}", 
      defaults: new { action = "Promote" } 
     ); 
    } 
+0

+1 - 略微變化 - 你如何處理類似出列隊列的事情,你想指定動作但不會有ID?謝謝。 – BuddyJoe

+0

@brun對不起,我不完全理解...就像api/widgets/promote? –