2013-12-21 40 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

相关问题