.Net Core Web API,基于一个值创建到具有相同路由前缀的不同控制器的路由逻辑
.Net Core Web API, create a routing logic to different controllers with same route prefix based on a value
我必须为 .Net Core 3.0 Web API 项目创建一个路由逻辑,该项目路由到具有给定值的相同路由前缀的不同控制器。
示例:
我有基于状态的控制器。
StateUsersCOController
StateUsersCAController
StateUsersWAController
等等。
他们都实现了相同的方法,例如:
GetUsers();
我想要实现的是根据状态信息将我的请求路由到相关控制器,例如:
api/StateUsers/CA
或
api/StateUsers?state=CA
或
api/StateUsers and Request Header has the state Information such as State:CA
我能想到的是创建一个名为 StateUsers 的控制器,以上述提供的方式之一捕获状态值并将请求重定向到相关控制器,但我想避免重定向并实现这是路由级别。你们能不能提供一个更好的方法来做到这一点。
具有固定路由模板的属性路由应该能够唯一区分控制器
[ApiController]
[Route("api/StateUsers/CO")]
public class StateUsersCOController : Controller {
//GET api/StateUsers/CO
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
[ApiController]
[Route("api/StateUsers/CA")]
public class StateUsersCAController : Controller {
//GET api/StateUsers/CA
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
[ApiController]
[Route("api/StateUsers/WA")]
public class StateUsersWAController : Controller {
//GET api/StateUsers/WA
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
请注意从路线中删除 GetUsers
以允许更简化的 RESTFul URL。
如果您坚持要在 URL 中包含 GetUsers
,则将其包含在路由模板中。
您可以使用 route 属性为其定义路由,据我了解您不想拥有 3 个不同的控制器以避免代码重复,因此您可以尝试类似的方法:
namespace Controllers
{
[ApiController]
[Route("api/stateusers")]
public class StateUsersController : ControllerBase
{
public StateUsersController()
{
}
// GET api/stateusers/getusers/{state}
[HttpGet]
[Route("getusers/{state}")]
public async Task<IActionResult> GetUsers(string state)
{
//Implement your logic
}
//Or
// GET api/stateusers/{state}
[HttpGet]
[Route("{state}")]
public async Task<IActionResult> GetUsersByState(string state)
{
//Implement your logic
}
}
}
注意:我建议您查看以下网站 REST Resource Naming Guide,您可以在其中查看 RESTful API 命名指南。
我必须为 .Net Core 3.0 Web API 项目创建一个路由逻辑,该项目路由到具有给定值的相同路由前缀的不同控制器。
示例: 我有基于状态的控制器。
StateUsersCOController
StateUsersCAController
StateUsersWAController
等等。
他们都实现了相同的方法,例如:
GetUsers();
我想要实现的是根据状态信息将我的请求路由到相关控制器,例如:
api/StateUsers/CA
或
api/StateUsers?state=CA
或
api/StateUsers and Request Header has the state Information such as State:CA
我能想到的是创建一个名为 StateUsers 的控制器,以上述提供的方式之一捕获状态值并将请求重定向到相关控制器,但我想避免重定向并实现这是路由级别。你们能不能提供一个更好的方法来做到这一点。
具有固定路由模板的属性路由应该能够唯一区分控制器
[ApiController]
[Route("api/StateUsers/CO")]
public class StateUsersCOController : Controller {
//GET api/StateUsers/CO
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
[ApiController]
[Route("api/StateUsers/CA")]
public class StateUsersCAController : Controller {
//GET api/StateUsers/CA
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
[ApiController]
[Route("api/StateUsers/WA")]
public class StateUsersWAController : Controller {
//GET api/StateUsers/WA
[HttpGet]
public IActionResult GetUsers() {
//...
}
}
请注意从路线中删除 GetUsers
以允许更简化的 RESTFul URL。
如果您坚持要在 URL 中包含 GetUsers
,则将其包含在路由模板中。
您可以使用 route 属性为其定义路由,据我了解您不想拥有 3 个不同的控制器以避免代码重复,因此您可以尝试类似的方法:
namespace Controllers
{
[ApiController]
[Route("api/stateusers")]
public class StateUsersController : ControllerBase
{
public StateUsersController()
{
}
// GET api/stateusers/getusers/{state}
[HttpGet]
[Route("getusers/{state}")]
public async Task<IActionResult> GetUsers(string state)
{
//Implement your logic
}
//Or
// GET api/stateusers/{state}
[HttpGet]
[Route("{state}")]
public async Task<IActionResult> GetUsersByState(string state)
{
//Implement your logic
}
}
}
注意:我建议您查看以下网站 REST Resource Naming Guide,您可以在其中查看 RESTful API 命名指南。