如果REST API端点全部获得,那么过滤器很容易。缺乏过滤器意味着"获得所有结果"。
GET /persons - gets all persons
GET /persons?name=john - gets all persons with name of "john"
但如果有默认值,那么我需要一些方法来显式不设置默认过滤器。继续上面的例子,如果每个人都有state
,那么#34;已批准"或者"待定",如果我的系统被设置为如果我没有明确指定状态,它将返回所有"已批准":
GET /persons - gets all approved persons, because defaults to state=approved
GET /persons?state=approved - same thing, gets all approved persons
GET /persons?state=pending - gets all pending persons
我如何获得所有人?如果有10种可能状态怎么办?还是100?
我可以想到几个方法:
GET /persons?state=any
- 但我永远不能使用实际状态any
GET /persons?state=*
- 会工作,但感觉很奇怪?或者是吗?GET /persons?state=
- 一些URL解析库会抱怨空白查询参数,这并不意味着"状态为空"而#34;状态是什么"?如何在我的GET中说"覆盖状态的默认值为"?
答案 0 :(得分:1)
也许这对你有用:
GET /persons?state
- 获取所有state
名称的人,无论是哪个值
GET /persons?state=
- 获取state
名称空值的所有人
您可能不需要区分这两种情况,因此您可以使用其中任何一种来获取state
名称的所有人(我只是认为没有=
的变体更漂亮)。
FWIW,application/x-www-form-urlencoded
format(即,通常在HTML表单中使用)在空值和无值之间没有差异。
就URI标准而言,查询组件中的这个名称 - 值对语法无论如何都是only a convention,因此您可以使用您希望的语法/语义。
答案 1 :(得分:0)
我认为这个问题没有一个答案。只要您记录了默认状态是否得到批准,如果您通过any
,*
等,我认为对客户不重要。除了最后一个,您的所有提案都没有问题。我认为这不是一个好的。
如果我正在设计API,我会使用all
并将其作为标准。我还建议对返回元素列表的所有端点使用分页。我使用offset
和limit
作为分页查询参数。在我的API中,如果客户端没有指定另一个分页条件,我将默认返回20个元素。