.net core api 分层路由
.net core api hierarchical routing
我正在构建一个 api,我希望能够使用分层路由,例如:
api/category/1234/product
api/category/1234/product/5678
目前我在 ProductController: [Route("api/[controller]")]
上使用 Route 属性,这是因为我的大部分路由都遵循该约定。
我在 ProductController 上有一个方法:
[HttpGet]
[Route("/api/category/{categoryId:int}/product")]
public IActionResult GetAllByCategoryId(int categoryId)
{
var products = _productRepo.Query(p => p.CategoryId == categoryId);
return Ok(products);
}
万岁,returns 数据 api/category/{categoryId:int}/product
但由于控制器上的 Route 属性,它仍将 return api/product/{categoryId:int}
的数据。
我的问题是:
有没有办法覆盖控制器路由模板?
目前我能想到的唯一替代选择是在每个方法上放置一个 Route 属性。必须有更好的方法来处理分层路由。
but it will still return the data for api/product/{categoryId:int}
because of the Route attribute on the controller.
这不太对。正如您在操作级别 Route
属性中指定的那样,您的 GetAllByCategoryId()
操作将只能由 /api/category/{categoryId:int}/product
访问。
如果您为 api/product/12345
发送 HTTP GET 并收到一些返回的数据,可能您在处理请求的控制器中有一些其他操作。它可能具有以下路由属性之一:
[HttpGet("{id}")]
public IActionResult Get(int id)
{
// ...
}
或
[Route("{id:int}")]
public IActionResult Get(int id)
{
// ...
}
所以只需调试您的控制器并检查实际执行的操作。我打赌不会是 GetAllByCategoryId()
.
我正在构建一个 api,我希望能够使用分层路由,例如:
api/category/1234/product
api/category/1234/product/5678
目前我在 ProductController: [Route("api/[controller]")]
上使用 Route 属性,这是因为我的大部分路由都遵循该约定。
我在 ProductController 上有一个方法:
[HttpGet]
[Route("/api/category/{categoryId:int}/product")]
public IActionResult GetAllByCategoryId(int categoryId)
{
var products = _productRepo.Query(p => p.CategoryId == categoryId);
return Ok(products);
}
万岁,returns 数据 api/category/{categoryId:int}/product
但由于控制器上的 Route 属性,它仍将 return api/product/{categoryId:int}
的数据。
我的问题是:
有没有办法覆盖控制器路由模板?
目前我能想到的唯一替代选择是在每个方法上放置一个 Route 属性。必须有更好的方法来处理分层路由。
but it will still return the data for api/product/{categoryId:int} because of the Route attribute on the controller.
这不太对。正如您在操作级别 Route
属性中指定的那样,您的 GetAllByCategoryId()
操作将只能由 /api/category/{categoryId:int}/product
访问。
如果您为 api/product/12345
发送 HTTP GET 并收到一些返回的数据,可能您在处理请求的控制器中有一些其他操作。它可能具有以下路由属性之一:
[HttpGet("{id}")]
public IActionResult Get(int id)
{
// ...
}
或
[Route("{id:int}")]
public IActionResult Get(int id)
{
// ...
}
所以只需调试您的控制器并检查实际执行的操作。我打赌不会是 GetAllByCategoryId()
.