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

时间:2015-12-18 10:14:21

标签: rest asp.net-web-api asp.net-web-api2

我正在尝试了解如何使用REST端点正确实现微服务模式。

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

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

因此,如果我想要一个User,那么我会向GET发出GetUser(100)个请求,它会返回一个User个对象作为JSON。

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

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

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

  1. 我如何命名这些新端点?
  2. 我是否必须通过名称明确调用这3个端点? (例如:GetUsersNames() GetUsersAge()等?)
  3. PS。这可能是一个很糟糕的例子,但我希望你能理解我的目标。当我超越默认的GET/PUT/POST/DELETE方法时,我不知道该怎么做/如何命名端点。

2 个答案:

答案 0 :(得分:2)

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

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

这比引入新端点要好得多。

答案 1 :(得分:0)

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

但是,您可以明确地定义其他路线。您需要在Configuration

中加入此内容
// 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

修改

是的,并非所有选项都应在单独的端点中解决,但它在某一点上是一个选项。 其他做什么:使用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);
}