在设计服务时,我对Asp.NET MVC控制器的工作方式非常满意。然而,新的WebAPI控制器。我该如何在这里设计我的服务呢?
假设我们有3种不同的方式来列出用户。
获取最新的10个,获取全部,获取非活动状态或其他。
这些可能都不需要参数。那么如何在WebAPI中解决这个问题呢?
IEnumerable<User> Get10Latest()
IEnumerable<User> GetAll()
IEnumerable<User> GetInactive()这是行不通的,因为它们有相同的参数签名。那么,在这里设计的正确方法是什么呢?
发布于 2012-11-28 04:07:01
通过使用action参数,您可以在一个控制器中为一个HTTP方法支持多个方法。
例如。
public class UsersController : ApiController
{
[ActionName("All")]
public HttpResponseMessage GetAll()
{
return new HttpResponseMessage();
}
[ActionName("MostIQ")]
public HttpResponseMessage GetMostIQ()
{
return new HttpResponseMessage();
}
[ActionName("TenLatest")]
public HttpResponseMessage GetTenLatest()
{
return new HttpResponseMessage();
}
}不幸的是,我还没有找到一种方法来让单个控制器同时处理有和没有动作的情况。
例如:
public class UsersController : ApiController
{
[ActionName("")] // Removing this attribute doesn't help
public HttpResponseMessage Get()
{
return new HttpResponseMessage();
}
[ActionName("All")]
public HttpResponseMessage GetAll()
{
return new HttpResponseMessage();
}
[ActionName("MostIQ")]
public HttpResponseMessage GetMostIQ()
{
return new HttpResponseMessage();
}
[ActionName("TenLatest")]
public HttpResponseMessage GetTenLatest()
{
return new HttpResponseMessage();
}
}能够对集合资源及其所有子集使用单个控制器将是很好的。
发布于 2012-11-27 19:58:29
可能会有人来帮我解决这个问题,但是你需要配置你的路由来处理Gets。这就是我是如何使用上面的操作来工作的:
config.Routes.MapHttpRoute(
name: "CustomApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { id = RouteParameter.Optional }
);因此,现在您的请求通过路由模板映射到正确的控制器->操作。请注意,新路由需要首先在WebApiConfig.cs中注册。如果您保留旧的,默认的。
编辑
重读这个问题后,我意识到我没有完全回答设计问题。我认为,从REST的角度来看,解决这个问题的一种方法是使用单独的资源来公开适当的集合(例如Get10Latest),因为我假设通过服务公开数据的确切子集是出于业务原因。在这种情况下,您可以通过在其自己的控制器中使用单个Get来公开该资源(如果这是所需的行为)。
发布于 2013-04-05 17:07:39
好吧,为什么不让urls像这样:
GET /users
GET /users/latest
GET /users/inactive使用路由,您可以将它们路由到
public classs UserController : ApiController
{
public IEnumerable<User> Get(string mode)
{
// mode is in routing restricted to be either empty, latest, or inactive
}
}否则,使用多个控制器。在Web API中使用操作名称是一种错误的方式。
https://stackoverflow.com/questions/13581601
复制相似问题