首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI服务设计

WebAPI服务设计
EN

Stack Overflow用户
提问于 2012-11-27 17:58:57
回答 3查看 252关注 0票数 1

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

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

获取最新的10个,获取全部,获取非活动状态或其他。

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

代码语言:javascript
复制
IEnumerable<User> Get10Latest()
IEnumerable<User> GetAll()
IEnumerable<User> GetInactive()

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-28 04:07:01

通过使用action参数,您可以在一个控制器中为一个HTTP方法支持多个方法。

例如。

代码语言:javascript
复制
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();
    }

}

不幸的是,我还没有找到一种方法来让单个控制器同时处理有和没有动作的情况。

例如:

代码语言:javascript
复制
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();
    }

}

能够对集合资源及其所有子集使用单个控制器将是很好的。

票数 1
EN

Stack Overflow用户

发布于 2012-11-27 19:58:29

可能会有人来帮我解决这个问题,但是你需要配置你的路由来处理Gets。这就是我是如何使用上面的操作来工作的:

代码语言:javascript
复制
config.Routes.MapHttpRoute(
            name: "CustomApi",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { id = RouteParameter.Optional }
        );

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

编辑

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

票数 0
EN

Stack Overflow用户

发布于 2013-04-05 17:07:39

好吧,为什么不让urls像这样:

代码语言:javascript
复制
GET /users
GET /users/latest
GET /users/inactive

使用路由,您可以将它们路由到

代码语言:javascript
复制
public classs UserController : ApiController
{
    public IEnumerable<User> Get(string mode)
    {
        // mode is in routing restricted to be either empty, latest, or inactive
     }
 }

否则,使用多个控制器。在Web API中使用操作名称是一种错误的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13581601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档