在查询字符串(REST)中传递具有多个值的多个过滤器

时间:2019-07-08 15:29:36

标签: rest asp.net-web-api

我最初在GET请求中发布了多个过滤器,这些过滤器在JSON中包含多个值,但是我认为这是不好的做法,因此我将其更改为POST,但我不喜欢它,因为从查询中获取结果没有任何帮助用POST做,所以我想我必须使用查询字符串

我发现的大多数过滤器示例都使用一个过滤器或一个值,但是我正在考虑是否存在最佳做法,即传递具有多个值的多个过滤器作为查询字符串中的单个参数。

例如,这是一个基本的查找所有红色的汽车

获取/ cars?color = red

但是如果我想寻找所有的汽车怎么办

红色,蓝色或绿色以及 拥有2个座位或更少 他们的品牌名称以b和 可以在美国,英国或德国购买

以下内容可以吗?

http://myserver/api/cars?color=red|blue|green¬seats<=2¬brand[startswith]b¬country= USA | UK |德国

我建议使用:

  1. |字符作为给定过滤器的每个值之间的分隔符
  2. ¬字符作为每个过滤器之间的分隔符
  3. [startsWith]处理搜索类型,但可以包含[=,<=,> =,<>,[包含],[endswith]等...

然后将在服务器端对此进行解析,并根据提供的值相应地构建相关的过滤器

希望这很有道理,但我真的对在考虑REST的情况下是否有用于这种情况的标准/最佳实践感兴趣?

谢谢。

1 个答案:

答案 0 :(得分:0)

与大多数设计问题一样,关键是为所有API进行一致的设计。您可以遵循某些众所周知的准则/标准,以使您的API易于发现。

例如,看一下OData。 this page上的“查询”部分与您的问题有关。这是一个示例:

https://services.odata.org/v4/TripPinServiceRW/People?$top=2 &amp; $select=FirstName, LastName &amp; $filter=Trips/any(d:d/Budget gt 3000)

另一个选择是OpenSearch标准。相关部分为here。这是一个示例:

https://opensearch.php?recordSchema=html&query=dc.creator any Mill* Grad*

另一个有趣的选项是GraphQL,它使将查询参数映射到数据提取参数变得更加容易。它使用过滤器有效负载而不是查询参数。请参见此处的规范:GraphQL Spec