在REST API中,使用URI查询参数处理集合的排序,过滤和分页被认为是一种很好的做法,例如:
GET /employees?offset=30&limit=15&name=Mary&sort=-surname
不幸的是,在某些“高级”情况下,参数的数量可能会“爆炸”,因此不再可能使用此解决方案。
回到上一个例子,假设我们想在许多其他领域应用一些更复杂的过滤器(例如:地址包含“NY”,年龄> 30,年龄<= 40,(婚姻状况是“结婚) “和工资&lt; 100000USD)或(婚姻状况”离婚“和工资&gt; = 100000USD),以及许多其他......)。
显然,在这种情况下,一组简单的查询参数是不合适的。
应该如何设计这种情况?也许客户端应该发送一个包含表示查询的结构化数据的POST?关于如何设计此类查询是否有任何或多或少的标准协议?
谢谢!
答案 0 :(得分:2)
一种方法是使搜索过滤器成为REST资源,这意味着创建新的REST方法:
/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"
]
}
}