【发布时间】:2021-08-13 00:58:48
【问题描述】:
我有一个 .Net 5 API 和一些嵌套路由,如下所示:
[Route("api/v{version:apiVersion}/orders")]
[ApiVersion("1.0")]
[ApiController]
public class OrdersController: ControllerBase
{
[HttpGet("{userId:required}")]
public async Task<ActionResult> Get(string userId,
CancellationToken cancellationToken = default)
{
// return the orders corresponding to the userId
}
}
[Route("api/v{version:apiVersion}/orders/details")]
[ApiVersion("1.0")]
[ApiController]
public class OrdersDetailsController: ControllerBase
{
[HttpGet("{orderId:required}")]
public async Task<ActionResult> Get(string orderId,
CancellationToken cancellationToken = default)
{
// return the order details
}
}
以下是我在向 API 发出请求时收到的响应列表:
-
GET /orders/some_dummy_user_id返回userId="some_dummy_user_id"的订单,可以 -
GET /orders/details/some_dummy_order_id返回orderId="some_dummy_order_id"的详细信息,就可以了 -
GET /orders/details/尝试返回与userId="details"对应的订单,这是不行的
问题是:是否有可能使GET /orders/details/ 请求匹配OrderDetailsController 路由并因此返回404,因为缺少orderId URL 参数?
【问题讨论】:
-
控制器有一个反序列化方法,可以解析响应并创建类。 ActionResult 是已解析数据的类。所以你有一个 Task
并且两者的 T 必须相同。客户端和服务器都有一个控制器。您想要的代码需要在服务器上,而不是客户端上。服务端的控制器解析请求,客户端的控制器解析响应。 -
恐怕不会。由于
userId参数是一个字符串并且没有约束。orders/details将匹配到{userId:required}路由,因为没有证据可以区分orders单词和userId字符串参数。
标签: c# .net routes controller