如何将不同的操作映射到具有相同签名的 Web API 方法
How to map different actions to Web API methods that would have same signature
我正在尝试使用 Web Api 最佳实践创建 REST 服务,但我遇到了一种我不知道如何处理的情况。
假设我有组,每个组中都有用户。
这是我的 GroupController 的样子:
[RoutePrefix("api/v1/groups")]
public class GroupsController : ApiController
{
[HttpGet]
[Route("{id:int}")]
public IHttpActionResult Get(int id)
{
return Ok();
}
// I also want to add endpoint which fetches all the users inside of group and I'd like to do it like this:
[HttpGet]
[Route("{id:int}/users")]
public IHttpActionResult Get(int id)
{
return Ok();
}
}
如您所见,我的第二个方法无法编译,因为我们不能在同一个 class.
中使用两个具有相同签名的方法
我的路线模板看起来像标准路线模板:
config.Routes.MapHttpRoute(
name: "DefaultRouting",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我知道我可以添加一个路由,它还映射了操作方法名称,但我想知道是否有更好的方法来实现我的目标。我想坚持编写 RESTful 服务的最佳原则。据我所知,其中一项建议是避免自定义操作名称,因为这在 WCF 服务中更为常见。
不要混合使用 MapHttpRoute()
样式路由配置和基于属性的路由。使用一个或另一个更简单(我更喜欢基于属性,因为它是明确的并且允许更清晰的 class 方法名称)。
您似乎也没有调用在您的配置上启用基于属性的路由所需的方法 - config.MapHttpAttributeRoutes()
。
最后,我将按如下方式重命名您的方法,以确保方法签名中没有冲突:GetGroups(int id)
和GetUsersForGroup(int id)
我正在尝试使用 Web Api 最佳实践创建 REST 服务,但我遇到了一种我不知道如何处理的情况。
假设我有组,每个组中都有用户。
这是我的 GroupController 的样子:
[RoutePrefix("api/v1/groups")]
public class GroupsController : ApiController
{
[HttpGet]
[Route("{id:int}")]
public IHttpActionResult Get(int id)
{
return Ok();
}
// I also want to add endpoint which fetches all the users inside of group and I'd like to do it like this:
[HttpGet]
[Route("{id:int}/users")]
public IHttpActionResult Get(int id)
{
return Ok();
}
}
如您所见,我的第二个方法无法编译,因为我们不能在同一个 class.
中使用两个具有相同签名的方法我的路线模板看起来像标准路线模板:
config.Routes.MapHttpRoute(
name: "DefaultRouting",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我知道我可以添加一个路由,它还映射了操作方法名称,但我想知道是否有更好的方法来实现我的目标。我想坚持编写 RESTful 服务的最佳原则。据我所知,其中一项建议是避免自定义操作名称,因为这在 WCF 服务中更为常见。
不要混合使用 MapHttpRoute()
样式路由配置和基于属性的路由。使用一个或另一个更简单(我更喜欢基于属性,因为它是明确的并且允许更清晰的 class 方法名称)。
您似乎也没有调用在您的配置上启用基于属性的路由所需的方法 - config.MapHttpAttributeRoutes()
。
最后,我将按如下方式重命名您的方法,以确保方法签名中没有冲突:GetGroups(int id)
和GetUsersForGroup(int id)