首页 文章

如何在REST服务中命名自定义 endpoints

提问于
浏览
3

我试图了解如何使用REST endpoints 正确实现微服务模式 .

我理解它的基础知识 . 互联网充满了这一点 . 典型例子:

class User
{
    public User GetUser(int id) { ... }
    public User GetUsers() { ... }
    public User PutUser(User user) { ... }
    public User PostUser(User user) { ... }
}

所以,如果我想要一个 User ,那么我会对 GetUser(100) 执行一个 GET 请求,它会返回一个 User 对象作为JSON .

但是假设我有一个页面,我想列出所有用户的 firstnamelastname . 然后我可以对 GetUsers()GET 请求 . 但是如果 User 表在数据库中有 100 列,并且我只需要显示两列(firstname,lastname),那么获取其他98列就太过分了 .

也许在另一个页面上我需要显示100列中的40列 . 在100列的其他第20页上 .

这意味着我需要3个额外的终点才能返回所有用户 . 但每个终点应该返回不同的数据 .

  • 如何命名这些新 endpoints ?

  • 我是否必须通过名称明确调用这3个 endpoints ? (例如: GetUsersNames() GetUsersAge() 等?)

PS . 这可能是一个很糟糕的例子,但是我希望你能理解当我超越默认的 GET/PUT/POST/DELETE 方法时,我知道该做什么/如何命名 endpoints .

2 回答

  • 0

    你可以做的是明确地询问特定字段,所以:

    GET /api/users/?fields=firstName,lastName
    

    这比引入新 endpoints 要好得多 .

  • 2

    您可以使用“属性路由”定义自定义视图 . 控制器中的方法默认使用您在配置中定义的路由模式 .

    但是,您可以明确地定义其他路线 . 您需要在_1233397中包含此内容:

    // this enables route attributes (route annotations at the actions in the controller)
    config.MapHttpAttributeRoutes();
    

    然后,您可以在控制器中定义其他路径并添加所需的过滤器逻辑:

    [Route("api/users/range/{rangeFrom}/{rangeTo}")]
    [HttpGet]
    public IHttpActionResult GetUsers(int from, int to)
    {
        return Ok(Users.Skip(from).Take(to-from));
    }
    
    [Route("api/users/namesonly")]
    [HttpGet]
    public IHttpActionResult GetUsers()
    {
        return Ok(Users.Select(u => new { firstName = u.FirstName, lastName = u.LastName }));
    }
    

    参考:Attribute Routing in ASP.NET Web API 2

    EDIT:

    是的,并非所有选项都应在单独的 endpoints 中解决,但它在某一点上是一个选项 . 其他人做的事情:使用URI参数来限制返回的数据计数或设置标志,并通过方法的签名使它们可用,例如:

    [Route("api/users/")]
    [HttpGet]
    public IHttpActionResult GetUsers([FromUri]int? from, [FromUri]int? count)
    {
        return Ok(Users.Skip(from ?? 0).Take(count ?? Users.Count));
    }
    

    或者返回更短的用户对象:

    [Route("api/users/")]
    [HttpGet]
    public IHttpActionResult GetUsers([FromUri]bool? shortVersion)
    {
        if (shortVersion.HasValue && shortVersion.Value)
            return Ok(Users.Select(u => new { firstName = u.FirstName, lastName = u.LastName }));
        else 
            return Ok(Users);
    }
    

相关问题