2013-12-21 39 views
1

這樣風格的API,我想一個REST的類型來確定知道我是如何處理重複的動作名稱:的網絡API控制器動作名稱不能由請求

public SchoolyearBrowseResponse Get(int userId) 
{ 
    return _service.GetSchoolyears(userId); 
} 

public SchoolyearOpenResponse Get(int id) 
{ 
    return _service.OpenSchoolyear(id); 
} 

據說行動名字應該是請求類型。現在我有兩個Get方法,它們是一個int參數,這在C#中是不可能的。

我應該命名第二個獲取:Open(int id)

回答

3

這樣風格的API,我想一個REST被命名後來才知道我是如何處理重複的動作名稱

在一個REST風格的API,你不應該處理這樣的重複。在REST風格的API中,您正在處理資源。

所以在您的特定情況下,你有2個資源:

  • 用戶
  • 學年

所以,你將有以下途徑:

  • /users/{userId}/schoolyears - >它對應於你的第一個動作
  • /shoolyears/{id} - >這相當於你的第二個動作

所以:

public class UsersController : ApiController 
{ 
    public SchoolyearBrowseResponse GetSchoolYears(int userId) 
    { 
     return _service.GetSchoolyears(userId); 
    } 
} 

和:

public class SchoolYearsController : ApiController 
{ 
    public SchoolyearOpenResponse Get(int id) 
    { 
     return _service.OpenSchoolyear(id); 
    } 
} 

和最後一步是你的路線:

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "UserSchoolYears", 
     routeTemplate: "api/{controller}/{userId}/schoolyears", 
     defaults: new { controller = "Users", action = "GetSchoolYears" } 
    ); 

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

由於我想提一下附註一個用戶的學年(你的SchoolyearBrowseResponse)班難以奏效。通常對於給定的用戶,你有一個學年的列表。如果你想爲一個用戶獲得一個特定的學年,你可以使用/users/{userId}/schoolyears/{schoolyearid}

+0

「通常對於給定的用戶,你有一個學年列表」但我的SchoolyearBrowseResponse班內有List 。這有道理嗎?或者我還沒有理解你... – HelloWorld

+0

是的,這是有道理的。 –

+0

再次感謝Darin,我喜歡你的回答,它真的很有幫助:) – HelloWorld

2

的典型解決方案將按照以下順序:)

_service.OpenSchoolyearByYear(id); 
_service.OpenSchoolyearByUserId(id); 
+0

我在SchoolyearBrowseResponse類中有一個List 列表。你的方法名稱對我來說沒有意義。 – HelloWorld

相關問題