
在 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)条件暂时还没想好如何表达,也许可以用 ^ 符号代替?<> 代替?或者因为情况太少可以放弃。目前也只是个非常初步的想法,不知道各位在实践中有没有更好的方法?
1 xream 2019 年 11 月 21 日 我想到了这个... https://github.com/jupe/mongoose-query |
2 shoaly 2019 年 11 月 21 日 多余的设计, 不应该是 http 那个层级想得事情, 属于项目或者团队内部定一个就好 |
3 Vegetable 2019 年 11 月 21 日 这个本身和 http 关系不大吧 完全看团队怎么定义 date 区间一般都是 start end 这样去,何必非得一个参数搞定呢.和你的思路比较像的大概是 mongodb 的查询语法. {key:{$gte:1,$lte:2}} django 的 orm 是(key__gte=1,key__lte=2) 感觉上你是不满足于 http 中只有等号,希望表示更复杂的运算关系,据我所知没有一套这样的约定,也许你更需要的是 graphQL 之类 |
4 fancy111 2019 年 11 月 21 日 多此一举,数据传到后台随便你怎么组合,为什么要 HTTP 来传组合? 你传 A,B 两参数,后台可以变成 A*B,A+B,A-B,A/B,A.B.....随便你组合,但是你如果传你那种固定格式,就是写死了而已。 |
5 sagaxu 2019 年 11 月 21 日 via Android 等一个人 |
6 009694 2019 年 11 月 21 日 第一反应是 Apache Lucene - Query Parser Syntax |
7 mytharcher OP @xream 看了一下表达上(或者说参数名)设计的不是很直观,结构也多了一层,不是特别希望按这样的方式。不过非常感谢给出参考以启发思路! |
8 mytharcher OP @Vegetable 是的,不满足于只有等号的表达,不想用 `start`/`end` 主要是这个参数名不是直接映射到字段名。的确也只是先在团队内尝试,所以希望能找出一个比较好的约定方式。 |
9 mytharcher OP |
10 imdong 2019 年 11 月 21 日 直接传 SQL 为什么不行呢? |
11 fangzy 2019 年 11 月 21 日 via Android 楼主这个需求有 rsql 和 fiql 比较接近 |
12 molvqingtai 2019 年 11 月 22 日 via Android 那个男人好久没来了 |
13 mytharcher OP @imdong 直接传 SQL 的问题是后端做安全性防御的时候解析起来要比一些简单格式麻烦的多,而且 SQL 灵活性太大。而设计一个简单格式可以满足大部分查询需求的话其实也就是一种折中。 |
14 TommyStandard 2019 年 11 月 22 日 有想法,再深入做下去就是另一个版本的 APIJSON 了 https://github.com/TommyLemon/APIJSON |