遵循RFC 6570处理AND和OR逻辑的API URI格式

问题描述

我目前正在构建基于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到应用于生产数据库的查询,但这与我们如何识别特定文档(资源)有关。 )。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...