在 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 16:52:10 +08:00 ![]() 我想到了这个... https://github.com/jupe/mongoose-query |
![]() | 2 shoaly 2019-11-21 16:52:50 +08:00 多余的设计, 不应该是 http 那个层级想得事情, 属于项目或者团队内部定一个就好 |
![]() | 3 Vegetable 2019-11-21 17:03:14 +08:00 这个本身和 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 17:09:33 +08:00 多此一举,数据传到后台随便你怎么组合,为什么要 HTTP 来传组合? 你传 A,B 两参数,后台可以变成 A*B,A+B,A-B,A/B,A.B.....随便你组合,但是你如果传你那种固定格式,就是写死了而已。 |
![]() | 5 sagaxu 2019-11-21 17:29:47 +08:00 via Android ![]() 等一个人 |
![]() | 6 009694 2019-11-21 17:34:10 +08:00 ![]() 第一反应是 Apache Lucene - Query Parser Syntax |
7 mytharcher OP @xream 看了一下表达上(或者说参数名)设计的不是很直观,结构也多了一层,不是特别希望按这样的方式。不过非常感谢给出参考以启发思路! |
8 mytharcher OP @Vegetable 是的,不满足于只有等号的表达,不想用 `start`/`end` 主要是这个参数名不是直接映射到字段名。的确也只是先在团队内尝试,所以希望能找出一个比较好的约定方式。 |
9 mytharcher OP |
![]() | 10 imdong 2019-11-21 17:47:50 +08:00 直接传 SQL 为什么不行呢? |
11 fangzy 2019-11-21 18:02:02 +08:00 via Android ![]() 楼主这个需求有 rsql 和 fiql 比较接近 |