【问题标题】:Differentiate routes by the querystring通过查询字符串区分路由
【发布时间】:2018-02-17 09:22:28
【问题描述】:

我需要能够有相同的路线来获得两种不同的输出。

/api/v1/items?ids=1,2,3

应该检索包含这三个条目的项目列表,但是

/api/v1/items?from=142523&limit=4

应检索光标分页响应,其中from 将是项目的ID。

我知道过去可以根据查询字符串创建路由约束,但根据此处发布的答案已将其删除: Query parameter route constraints

解决这个问题的最佳方法是什么?属性路由是不行的,因为我们不想在应用程序中有items/{list-of-ids} 路由。我可以使用可选参数将这些方法合并为一个,但是 API 输出在自动生成的文档中不一致(分页与非分页响应)。是否可以使用自定义路由约束来实现我想要的?

【问题讨论】:

  • 我不会说你得到两种不同的输出,而是你得到相同的输出,只是更大集合的不同表示。还要考虑您可能希望对未过滤的请求进行限制,这样您就不会返回 all 的结果。

标签: c# .net routing asp.net-web-api2


【解决方案1】:

您可以使用Optional Parameter 来定义您的 API 端点,如下所示。如果您保持参数名称相同并且不必为它们定义单独的路由,您的查询字符串值将自动绑定参数

[HttpGet]
public IActionResult items(string ids, int from = 0, int limit = 0)
{
  //code here
}

【讨论】:

  • 我实际上需要将这两个方法分开,因为它们定义了一个输出类型(自定义 PaginatedResponse 和一个项目列表),然后在 Swagger API 文档中可见。
  • 为什么不在这两种情况下都返回一个项目列表?只要过滤器存在,客户端可以分页,为什么服务器需要处理呢?例如,items?take=10,然后是 items?skip=10&take10,它可以很好地映射到 LINQ,如果需要,IQueryable<T>
  • 这不是我能控制的。 API 使用相同的包装类作为对包括分页的所有请求的响应。 API 消费者期望它,我无法删除/更改它。实际上,我需要创建另一个方法并为其设置单独的路由,以便它在生成的文档中显示为具有不同结构 json 输出的完全不同的请求,基于 webAPI2 中不再存在的查询字符串约束。
  • 最后,经过几个小时的研究,似乎不可能以相对理智的方式轻松地重新创建查询字符串约束,因此我们确实将这些方法合二为一并创建了一个假分页输出类。不完美,但目前似乎没有更好的方法。
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2018-04-30
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多