我正在尝试了解如何使用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。
但是假设我有一个页面,我想列出所有用户的firstname
和lastname
。然后,我可以GET
向GetUsers()
发出请求。但是如果User
表在数据库中有100
列,并且我只需要显示两列(firstname,lastname),那么获取其他98列就太过分了。
也许在另一个页面上我需要显示100列中的40列。在100列的其他第20页上。
这意味着我需要3个额外的终点才能返回所有用户。但每个终点应该返回不同的数据。
GetUsersNames()
GetUsersAge()
等?) PS。这可能是一个很糟糕的例子,但我希望你能理解我的目标。当我超越默认的GET/PUT/POST/DELETE
方法时,我不知道该怎么做/如何命名端点。
答案 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);
}