API端点和结构

时间:2016-04-05 10:20:27

标签: api asp.net-web-api asp.net-core

我正在使用ASP.NET Core创建Web Api,我有以下内容:

public class MessageApiController : Controller {

  [HttpGet("messages/{id}")]
  public async Task<IActionResult> GetById() { }

}

public class UserApiController : Controller {

  [HttpGet("users/{id}")]
  public async Task<IActionResult> GetById() { }

}

现在我需要为用户获取所有消息。我知道两个选择:

  [HttpGet("messages")]
  public async Task<IActionResult> GetMessagesByUser(Int32 userId) { }

  [HttpGet("users/{userId}/messages")]
  public async Task<IActionResult> GetMessagesByUser(Int32 userId) { }

我有几个问题:

  1. 哪个更常见?我想我甚至可以同时使用......
  2. 使用“users / {userId} / messages”时,您会将此操作放在MessageApiController或UserApiController中吗?

1 个答案:

答案 0 :(得分:1)

这取决于您希望消费者如何使用该服务。

您需要问自己的问题,是否有必要调用/messages获取所有消息(来自所有用户),或者是否只能从1个用户获取消息(并排除可能性永远从所有用户获取消息)。

这个问题很重要,因为它会告诉你使用哪一个,或者你应该使用两者。

如果没有计划允许用户从所有用户那里获取消息,最好使用users/{userId}/messages,因为这将强制执行此规则。在这种情况下,users/{userId}/messages是用户userId的消息资源。

另一方面,期望messages将允许您查询所有用户的消息或至少用户有权限的消息(即管理用户将在此端点上获得所有用户的消息)和你可以通过查询参数过滤这个(而不是在路径中编码)。如果你不想这样,那么messages将是无效的路线或只是误导。

  
      
  1. 哪个更常见?我想我甚至可以同时使用......
  2.   

users/{userId}/messages更具表现力,从网址上可以清楚地看出,您希望来自给定用户的所有消息。

如果您还拥有允许某些用户查看来自其他用户的消息的权限系统(即公司员工应该能够看到公司的所有消息,而不仅仅是直接发送的消息),则可以使用

messages使用查询过滤器来减少这种情况(由单个或多个用户)。

  
      
  1. 使用&#34; users / {userId} / messages&#34;你会把这个动作放在MessageApiController或UserApiController中吗?
  2.   

MessageApiController,因为它对消息进行操作,而不是对用户进行操作。用户只是强制性参数。

旁注:

您可以通过在控制器类型上放置路径而不是在路径上完全使用路径模板来简化控制器路由。

[Route("[controller]")]
public class MessageController : Controller 
{
    [HttpGet("id}")]
    public async Task<IActionResult> GetById() 
    {
    }
}

请注意我删除了&#34; Api&#34;来自控制器名称,因为[controller]占位符将类名减去&#34; Controller&#34;作为路由参数。 MessageController上的路由充当前缀,因此GetById()仍然会message/{id}作为路由,但您不必重复&#34;消息&#34;每个动作的一部分。