REST API设计中的高级分页,排序和过滤

时间:2017-03-19 22:53:13

标签: rest

在REST API中,使用URI查询参数处理集合的排序,过滤和分页被认为是一种很好的做法,例如:

GET /employees?offset=30&limit=15&name=Mary&sort=-surname

不幸的是,在某些“高级”情况下,参数的数量可能会“爆炸”,因此不再可能使用此解决方案。

回到上一个例子,假设我们想在许多其他领域应用一些更复杂的过滤器(例如:地址包含“NY”,年龄> 30,年龄<= 40,(婚姻状况是“结婚) “和工资&lt; 100000USD)或(婚姻状况”离婚“和工资&gt; = 100000USD),以及许多其他......)。

显然,在这种情况下,一组简单的查询参数是不合适的。

应该如何设计这种情况?也许客户端应该发送一个包含表示查询的结构化数据的POST?关于如何设计此类查询是否有任何或多或少的标准协议?

谢谢!

2 个答案:

答案 0 :(得分:2)

一种方法是使搜索过滤器成为REST资源,这意味着创建新的REST方法:

  • POST /filters,期待一个带有过滤器的主体,例如(marital status is "married" AND salary<100000USD) OR (marital status is "divorced" AND salary>=100000USD)并返回此搜索的唯一ID,以及(以避免到服务器的往返)第一个结果,以及指向下一个结果的链接
  • 获取/filters/<id>/<offset>,从id
  • 开始返回搜索结果offset

答案 1 :(得分:1)

您是否尝试发布带过滤器的正文?

{
  "age": {
    "$gte": 30,
    "$lte": 40
  },
  "status": {
    "$in": [
        "Divorced",
        "Single"
    ]
  }
}