1

在设计服务时,我对 Asp.NET MVC 控制器的工作方式非常满意。但是新的 WebAPI 控制器。我应该如何在这里设计我的服务?

假设我们有 3 种不同的方式来列出例如用户。

获取 10 个最新的,获取所有,获取非活动或其他。

这些都可能不需要参数。那么你将如何在 WebAPI 中解决这个问题

IEnumerable<User> Get10Latest()
IEnumerable<User> GetAll()
IEnumerable<User> GetInactive()

这是行不通的,因为它们具有相同的参数签名。那么在这里设计这个的正确方法是什么?

4

3 回答 3

1

通过使用 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-27T20:07:00.740 回答
0

那么为什么没有这样的网址:

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 中使用动作名称是一种错误的处理方式。

于 2013-04-05T09:07:38.743 回答
0

可能有人会陪我,并为此缠住我,但你需要配置你的路由来处理 Gets。这就是我如何使用上述操作:

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

因此,现在您的请求通过路由模板映射到正确的控制器 -> 操作。注意,新路由需要先在 WebApiConfig.cs 中注册。如果你保留旧的,默认的。

编辑

重新阅读了这个问题后,我意识到我并没有完全回答设计问题。我认为从 REST 的角度来看,一种解决方法是使用单独的资源来公开正确的集合(例如 Get10Latest),因为我认为通过服务。在这种情况下,您将通过其自己的控制器中的单个 Get 公开该资源(如果这是所需的行为)。

于 2012-11-27T11:58:29.290 回答