" match-all"的正确查询参数是什么?在有默认值的REST过滤器中?

时间:2014-12-23 20:20:36

标签: api rest url query-parameters url-design

如果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中说"覆盖状态的默认值为"?

2 个答案:

答案 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并将其作为标准。我还建议对返回元素列表的所有端点使用分页。我使用offsetlimit作为分页查询参数。在我的API中,如果客户端没有指定另一个分页条件,我将默认返回20个元素。