问题描述
我目前正在构建基于Crud的Rest API,该API使用查询字符串来优化搜索。
例如,以下示例将返回所有具有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,但没有看到有人提及这样做。
谢谢!
解决方法
构造查询以检查所有蓝色或轿车或四门车的查询的正确方法是什么?
通常的答案是使用具有不同路径的标识符
-
/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
妈妈当然会提醒您,您不应该从HTTP请求blindly copy information到应用于生产数据库的查询,但这与我们如何识别特定文档(资源)有关。 )。