设想了一种 HTTP 更丰富语义查询参数的格式,不知道是否已有类似的标准或者方法?

2019-11-21 16:37:55 +08:00
 mytharcher

在 RESTful 的查询设计中,通过 URL query 传递查询参数大部分只能使用 a=1&b=2 这样的形式,一些情况下总感觉不够用,尤其是在范围查询的时候,很难表达条件是大于一个数且小于一个数的情况。

所以考虑通过一些符号增加查询参数的表达,归纳了一些想法如下:

查询规则

可用数值比较的情况:

其中 | 连接同一个参数的“或”(OR)条件,()[] 表达开闭区间。

同时也想到针对字符串匹配的情况:

集合查询:

反转条件:

缺陷或问题

  1. “且”(AND)条件暂时还没想好如何表达,也许可以用 ^ 符号代替?
  2. 小括号因为用于开区间,没有用于表达运算优先级的符号了,或许用尖括号 <> 代替?或者因为情况太少可以放弃。
  3. 为什么不用 GraphQL ?不是一个方向,GraphQL 更侧重于级联组合查询和属性筛选。

目前也只是个非常初步的想法,不知道各位在实践中有没有更好的方法?

2526 次点击
所在节点    HTTP
14 条回复
xream
2019-11-21 16:52:10 +08:00
shoaly
2019-11-21 16:52:50 +08:00
多余的设计, 不应该是 http 那个层级想得事情, 属于项目或者团队内部定一个就好
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 之类
fancy111
2019-11-21 17:09:33 +08:00
多此一举,数据传到后台随便你怎么组合,为什么要 HTTP 来传组合?
你传 A,B 两参数,后台可以变成 A*B,A+B,A-B,A/B,A.B.....随便你组合,但是你如果传你那种固定格式,就是写死了而已。
sagaxu
2019-11-21 17:29:47 +08:00
等一个人
009694
2019-11-21 17:34:10 +08:00
第一反应是 Apache Lucene - Query Parser Syntax
mytharcher
2019-11-21 17:38:14 +08:00
@xream
看了一下表达上(或者说参数名)设计的不是很直观,结构也多了一层,不是特别希望按这样的方式。不过非常感谢给出参考以启发思路!
mytharcher
2019-11-21 17:42:05 +08:00
@Vegetable
是的,不满足于只有等号的表达,不想用 `start`/`end` 主要是这个参数名不是直接映射到字段名。的确也只是先在团队内尝试,所以希望能找出一个比较好的约定方式。
mytharcher
2019-11-21 17:46:32 +08:00
@shoaly
@fancy111
可能我没表达好,没有希望把这种“约定”上升到 HTTP 的标准,只是希望利用 HTTP 已有的格式做一些渐进性的增强。如果能形成一套规则体系,那么后台处理的时候也会是一个形式化的“处理机”,不需要每个接口开发人员自己约定一套自己的映射方式,更有利于团队统一。
imdong
2019-11-21 17:47:50 +08:00
直接传 SQL 为什么不行呢?
fangzy
2019-11-21 18:02:02 +08:00
楼主这个需求有 rsql 和 fiql 比较接近
molvqingtai
2019-11-22 01:43:14 +08:00
那个男人好久没来了
mytharcher
2019-11-22 10:35:27 +08:00
@imdong
直接传 SQL 的问题是后端做安全性防御的时候解析起来要比一些简单格式麻烦的多,而且 SQL 灵活性太大。而设计一个简单格式可以满足大部分查询需求的话其实也就是一种折中。
TommyStandard
2019-11-22 15:16:03 +08:00
有想法,再深入做下去就是另一个版本的 APIJSON 了
https://github.com/TommyLemon/APIJSON

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621816

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX