2017-09-08 34 views
0

我需要能够拥有相同的路由来获取两种不同的输出。通过查询字符串区分路由

/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输出不一致。是否有可能实现我想要使用自定义路由约束?

+0

我不会说你会得到两种不同的输出,而你得到的独立路径得到的参数绑定同样的,只是一个更大的集合的不同表示。另外请考虑您可能希望限制未过滤的请求,以便您不返回所有结果。 –

回答

2

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

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

我实际上需要将这两个方法分开,因为它们有一个定义的输出类型(一个自定义的PaginatedResponse和一个项目列表),然后在Swagger API文档中可见。 – Slowacki

+1

为什么不只是返回两种情况下的物品清单?只要过滤器存在,以便客户端可以分页,为什么服务器需要处理它?例如,'items?take = 10',然后是'items?skip = 10&take10',然后可以很好地映射到LINQ,并且'IQueryable '如果需要的话 –

+0

这不是我可以控制的东西。 API使用相同的包装类作为对包含分页的所有请求的响应。 API消费者期望它,我不能删除/更改它。实际上,我需要创建另一个方法并为其创建一个单独的路由,以便在生成的文档中将其显示为基于查询字符串约束(具有不同结构的json输出)的完全不同的请求,该查询字符串约束不再存在于webAPI2中。 – Slowacki