通过复合键作为查询参数获取资源过滤?

GET a resource filtering by a composite key as query parameter?

我正在考虑创建端点的最佳方式,其中一个过滤器是复合键。

例如,我们有一个搜索订单的休息服务:

/orders/

我们可以按开始日期和结束日期过滤订单:

/orders?dt-start=2017-05-11T17:12Z&dt-final=2017-05-11T17:12Z

到此为止,一切顺利。但我想按客户过滤订单。客户通过他的 type 文件和 number 本文件来识别。

所以,这样的事情是可能的:

/orders?type=ID&number=123456789

但是类型和数字是查询参数,只能一起,它是一个组合键。但是使用查询参数——就像最后一个例子——似乎 API 用户也可以这样做:

/orders?number=123456789
/orders?type=ID

但没有意义。是的,如果只传递其中一个参数,我可能会 return 响应错误(错误请求),但这对于正在读取 API 端点的人来说是不自然的。

另一种策略是在同一参数中组合类型和数字,但我从未在任何 API 中看到过这种情况。

/orders?document=ID-12345678

我也觉得奇怪。我更喜欢使用分隔参数而不是这个。

那么,有没有一种方法可以使用查询参数并以更"elegant"的方式解决这个问题?

谢谢!

如果 type 参数不存在(我可能会选择最多 common/used 文件类型取决于你的情况)。

虽然对于 number 参数我会强制执行它,即通过指定它是一个 必需的 参数(在文档中的某处?)。如果不存在,return 一个错误的请求。

不要组成组合键,而是有条件地要求两个参数。这还不错,IMO 比创建一个不由数据(或资源)表示的复合键要干净得多。

我以前做过这个,所以为了帮助说明,我会指出它。 This 资源用于查询 Cyber​​Facts。查询受日期范围约束。要获取数据,您可以执行以下两项操作之一。

  1. 你可以说?today=true,得到今天的数据(相当于说?startDate=2017-05-13&endDate=2017-05-13
  2. 您可以使用 startDateendDate 查询参数,但是如果您使用一个而不是另一个(例如 ?startDate=2017-05-13),您将收到 400 Bad Request 状态对查询的响应和响应正文中的错误消息。

所以在这种情况下,我做了一些事情来完成这项工作

  1. 设置更高优先级的参数(today 覆盖 startDateendDate
  2. 记录有效行为
  3. 提供适当的错误响应

你只需要#2#3,我想。不知道您的所有用例,我建议使用 /orders?type=ID&number=123456789 并记录 numbertype=ID 时是一个必需的查询参数,并且还包括适当的错误(例如:"You queried for an Order by Type 'ID', however you did not provide a 'number' query parameter")