通过复合键作为查询参数获取资源过滤?
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 资源用于查询 CyberFacts。查询受日期范围约束。要获取数据,您可以执行以下两项操作之一。
- 你可以说
?today=true
,得到今天的数据(相当于说?startDate=2017-05-13&endDate=2017-05-13
)
- 您可以使用
startDate
和 endDate
查询参数,但是如果您使用一个而不是另一个(例如 ?startDate=2017-05-13
),您将收到 400 Bad Request
状态对查询的响应和响应正文中的错误消息。
所以在这种情况下,我做了一些事情来完成这项工作
- 设置更高优先级的参数(
today
覆盖 startDate
和 endDate
)
- 记录有效行为
- 提供适当的错误响应
你只需要#2和#3,我想。不知道您的所有用例,我建议使用 /orders?type=ID&number=123456789
并记录 number
在 type=ID
时是一个必需的查询参数,并且还包括适当的错误(例如:"You queried for an Order by Type 'ID', however you did not provide a 'number' 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 资源用于查询 CyberFacts。查询受日期范围约束。要获取数据,您可以执行以下两项操作之一。
- 你可以说
?today=true
,得到今天的数据(相当于说?startDate=2017-05-13&endDate=2017-05-13
) - 您可以使用
startDate
和endDate
查询参数,但是如果您使用一个而不是另一个(例如?startDate=2017-05-13
),您将收到400 Bad Request
状态对查询的响应和响应正文中的错误消息。
所以在这种情况下,我做了一些事情来完成这项工作
- 设置更高优先级的参数(
today
覆盖startDate
和endDate
) - 记录有效行为
- 提供适当的错误响应
你只需要#2和#3,我想。不知道您的所有用例,我建议使用 /orders?type=ID&number=123456789
并记录 number
在 type=ID
时是一个必需的查询参数,并且还包括适当的错误(例如:"You queried for an Order by Type 'ID', however you did not provide a 'number' query parameter")