我正在使用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) { }
我有几个问题:
答案 0 :(得分:1)
这取决于您希望消费者如何使用该服务。
您需要问自己的问题,是否有必要调用/messages
获取所有消息(来自所有用户),或者是否只能从1个用户获取消息(并排除可能性永远从所有用户获取消息)。
这个问题很重要,因为它会告诉你使用哪一个,或者你应该使用两者。
如果没有计划允许用户从所有用户那里获取消息,最好使用users/{userId}/messages
,因为这将强制执行此规则。在这种情况下,users/{userId}/messages
是用户userId
的消息资源。
另一方面,期望messages
将允许您查询所有用户的消息或至少用户有权限的消息(即管理用户将在此端点上获得所有用户的消息)和你可以通过查询参数过滤这个(而不是在路径中编码)。如果你不想这样,那么messages
将是无效的路线或只是误导。
- 哪个更常见?我想我甚至可以同时使用......
醇>
users/{userId}/messages
更具表现力,从网址上可以清楚地看出,您希望来自给定用户的所有消息。
messages
使用查询过滤器来减少这种情况(由单个或多个用户)。
- 使用&#34; users / {userId} / messages&#34;你会把这个动作放在MessageApiController或UserApiController中吗?
醇>
致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;每个动作的一部分。