繁体   English   中英

API Rest 中的过滤

[英]API Filtering in Rest

我有一个要求,用户希望通过 REST API(GET 调用)过滤表(API 过滤应该允许使用括号来定义操作优先级并使用可用字段的任何组合。支持的操作应该包括或,和,等式(等于), ne (不等于), gt (大于), lt (小于), in, like)

用例示例:

考虑具有列 user_id,first_name,last_name,food_intake_calories,created_at 的表

查询应支持 (created_at eq '2016-05-01') AND ((food_intake_calories gt 20) OR (food_intake_calories lt 10))。

我首先想到将输入替换为“=”,将 ne 替换为“.=”,然后直接将 append 这个到 sql 的 where 子句并运行查询,但这将再次邀请 Z9778840A0100CB30C982876741B0B5A2 注入。 我不知道如何处理这个问题。 我正在使用 java 和 dropwizard 作为后端服务器。

我的建议是使用Jexl表达式解析器来形式化这个解析。

可以替换一些大括号并使用自定义代码来处理请求,但需求会慢慢发生变化,您会得到一个复杂的代码来解析 REST 请求。

OData 将是 go 的正确方法。 它具有为用户用例设计的规范。 使用这种标准的数据表示方式的好处是,只要遵循标准的 OData 查询,每个人都可以使用您的 API。

结帐: https://www.odata.org/

希望这可以帮助 !!

只要您先检查它,我认为将完整表达式解析到 sql 的责任传递给它不一定有问题。 你可以 devise 一组规则:

  • 用空替换括号
  • 在 AND 和 OR 上拆分
  • 剩下的语句集必须是column operator 'value'的形式
  • 列必须在已知列集中
  • 运算符必须在已知运算符的集合中
  • value 必须以 ' 开头和结尾,并且之间的所有内容都将被视为一个值
  • 将实际value替换为 db 参数占位符并将给定的数据值放入该参数的值中 - 将这些值放入 hash map 键集以对它们进行重复数据删除,然后将它们替换为原始 Z8A5DA52ED1201A 参数,添加它们 247D359E7A 参数到你的 db 命令,就像你 go
  • 你现在最终得到一个 state 查询适合在没有注入风险的情况下针对数据库运行 - 列和运算符位于已知集合中,并且值已参数化
  • 如果谓词形式如此自由,您可能需要考虑限制可能用于这些查询的结果或执行次数/数据库时间量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM