API 按照 RFC 6570 处理 AND 和 OR 逻辑的 URI 格式
API URI format for handling AND and OR logic following RFC 6570
我目前正在构建一个基于 Crud 的 Rest API,它使用查询字符串来优化搜索。
例如,以下 return 所有蓝色轿车都是轿车 AND 有 4 扇门:
/cars?color=blue&type=sedan&doors=4
构建查询以检查所有蓝色汽车的正确方法是什么 OR 是轿车 OR 有 4 扇门?
这可能是不正确的,但我想它将展示我正在尝试做的事情:
/cars?color=blue|type=sedan|doors=4
用这些字段之间的分隔符来操纵 API 执行的操作类型是否合适,将 url 更像是数据库查询?如果是,你如何处理嵌套操作,比如得到一辆蓝色的汽车 OR 一辆轿车 AND 有 4 扇门.
例如这样的事情:
/cars?color=blue|(type=sedan&doors=4)
我正在尝试关注 RFC 6570,但没有看到任何人提到做这样的事情。
谢谢!
What would be the correct approach to structure a query to check for all cars that are blue OR are sedans OR have 4 doors?
通常的答案是使用具有不同路径的标识符
/theOneWithTheAnd?color=blue&type=sedan&doors=4
/theOneWithTheOr?color=blue&type=sedan&doors=4
如果您在网络上想象它,它可能看起来像两种不同的形式,可能具有相同的输入字段,但具有不同的 form.action.
表示为 RFC 6570 一级模板,您会得到类似
的内容
/theOneWithTheAnd?color={color}&type={type}&doors={doors}
/theOneWithTheOr?color={color}&type={type}&doors={doors}
当然,您也可以将标识符的路径段表示为模板参数
/{reportName}?color={color}&type={type}&doors={doors}
使用二级模板,您可以跨越多个路径段
{+reportName}?color={color}&type={type}&doors={doors}
使用三级模板,可以简化查询部分的描述
{+reportName}{?color,type, doors}
使用键值对很方便(我们有很多工具已经知道如何完成这项工作),但不是必需的。您可以轻松地将 sql 查询编码为标识符
/reports?select%20*%20from%20students;
URI 模板仍然有效
/reports?select%20*%20from%20students%20where%20id={id};
从REST的角度来看,它仍然只是一个标识符;标识符拼写和更通用的拼写之间没有根本区别
/8721ccc6-75e0-4da3-93f4-7f9dc9d4cfd9
妈妈当然会提醒你,你不应该 blindly copy information 从 HTTP 请求到你应用于生产数据库的查询,但这与我们如何识别特定文档的问题无关(资源)。
我目前正在构建一个基于 Crud 的 Rest API,它使用查询字符串来优化搜索。
例如,以下 return 所有蓝色轿车都是轿车 AND 有 4 扇门:
/cars?color=blue&type=sedan&doors=4
构建查询以检查所有蓝色汽车的正确方法是什么 OR 是轿车 OR 有 4 扇门?
这可能是不正确的,但我想它将展示我正在尝试做的事情:
/cars?color=blue|type=sedan|doors=4
用这些字段之间的分隔符来操纵 API 执行的操作类型是否合适,将 url 更像是数据库查询?如果是,你如何处理嵌套操作,比如得到一辆蓝色的汽车 OR 一辆轿车 AND 有 4 扇门.
例如这样的事情:
/cars?color=blue|(type=sedan&doors=4)
我正在尝试关注 RFC 6570,但没有看到任何人提到做这样的事情。
谢谢!
What would be the correct approach to structure a query to check for all cars that are blue OR are sedans OR have 4 doors?
通常的答案是使用具有不同路径的标识符
/theOneWithTheAnd?color=blue&type=sedan&doors=4
/theOneWithTheOr?color=blue&type=sedan&doors=4
如果您在网络上想象它,它可能看起来像两种不同的形式,可能具有相同的输入字段,但具有不同的 form.action.
表示为 RFC 6570 一级模板,您会得到类似
的内容/theOneWithTheAnd?color={color}&type={type}&doors={doors}
/theOneWithTheOr?color={color}&type={type}&doors={doors}
当然,您也可以将标识符的路径段表示为模板参数
/{reportName}?color={color}&type={type}&doors={doors}
使用二级模板,您可以跨越多个路径段
{+reportName}?color={color}&type={type}&doors={doors}
使用三级模板,可以简化查询部分的描述
{+reportName}{?color,type, doors}
使用键值对很方便(我们有很多工具已经知道如何完成这项工作),但不是必需的。您可以轻松地将 sql 查询编码为标识符
/reports?select%20*%20from%20students;
URI 模板仍然有效
/reports?select%20*%20from%20students%20where%20id={id};
从REST的角度来看,它仍然只是一个标识符;标识符拼写和更通用的拼写之间没有根本区别
/8721ccc6-75e0-4da3-93f4-7f9dc9d4cfd9
妈妈当然会提醒你,你不应该 blindly copy information 从 HTTP 请求到你应用于生产数据库的查询,但这与我们如何识别特定文档的问题无关(资源)。