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 请求到你应用于生产数据库的查询,但这与我们如何识别特定文档的问题无关(资源)。