在 RESTful 的查询设计中,通过 URL query 传递查询参数大部分只能使用 a=1&b=2 这样的形式,一些情况下总感觉不够用,尤其是在范围查询的时候,很难表达条件是大于一个数且小于一个数的情况。
所以考虑通过一些符号增加查询参数的表达,归纳了一些想法如下:
查询规则
可用数值比较的情况:
date=2019-01-01:相等查询date=[2019-01-01,2019-01-31]:范围查询date=[2019-01-01,2019-02-01):闭开区间date=[2019-01-01,2019-01-31]|[2019-03-01,2019-03-31]:多区间查询date=[,2019-01-31]|[2019-03-31,]:半区间查询
其中 | 连接同一个参数的“或”(OR)条件,() 和 [] 表达开闭区间。
同时也想到针对字符串匹配的情况:
name=keyword:精确匹配name=keyword*:开头匹配name=*keyword:结尾匹配
集合查询:
id={1,2}:IN表达
反转条件:
date=![2019-01-01,2019-02-01):不在 2019 年 1 月内的日期name=!keyword:不相等id=!{1,2}:NOT IN表达
缺陷或问题
- “且”(
AND)条件暂时还没想好如何表达,也许可以用^符号代替? - 小括号因为用于开区间,没有用于表达运算优先级的符号了,或许用尖括号
<>代替?或者因为情况太少可以放弃。 - 为什么不用 GraphQL ?不是一个方向,GraphQL 更侧重于级联组合查询和属性筛选。
目前也只是个非常初步的想法,不知道各位在实践中有没有更好的方法?