做一个REST样式的API我想知道我如何处理重复的动作名称:
public SchoolyearBrowseResponse Get(int userId)
{
return _service.GetSchoolyears(userId);
}
public SchoolyearOpenResponse Get(int id)
{
return _service.OpenSchoolyear(id);
}
据说动作的名称应该是请求类型。现在我有两个带有int参数的Get方法,这在C#中是不可能的。
我应该命名第二个获取:Open(int id)
吗?
答案 0 :(得分:3)
做一个REST样式的API我想知道我如何处理重复的动作名称
在RESTful样式的API中,您永远不必处理此类重复项。在RESTful样式的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}
。
答案 1 :(得分:2)
典型的解决方案是按以下顺序命名:)
_service.OpenSchoolyearByYear(id);
_service.OpenSchoolyearByUserId(id);