首页 > 解决方案 > 在查询字符串中传递“元组”以在 REST API 中进行过滤

问题描述

我有一个基于 Flask 的 GET Api 端点,允许获取员工信息。

我们的客户要求在“名字”和“姓氏”字段中添加“元组”列表过滤参数,以便他可以指定名字元组 - 例如:[("Ben","Long"), ("John", "Miller"), ....]

结果不应显示像 ("Ben","Miller") 或 ("John","Long") 这样的记录,因此这些字段需要在查询参数中以某种方式互连。

我在这里看到了许多选项:

  1. 添加 2 个列表参数"firstNameTup""lastNameTup"并要求客户端将元组“解压缩”到这两个列表中,以便在服务器上将它们压缩在一起。
  2. 添加一个基于 json 的参数并要求客户端创建一个对象列表[{"first" : "...", "last" : ""}, ...]并将它们编码为 base64 字符串。
  3. 对客户说“不”,并将过滤掉“不匹配”元组的负担从结果转移给他。

有没有其他好的方法来实现这个?你的建议是什么?

谢谢!

标签: pythonflaskapi-designflask-restfulquery-parameters

解决方案


我认为该问题有数千种有效的解决方案(据我所知)。

IMO,API 服务器应该提供尽可能灵活和可读的服务,(客户端开发人员和将加入团队的服务器端新开发人员都易于理解),以便其他客户端将来能够使用它。

flask-restless 的方法非常灵活,但很严格,我采用了它,尽管该项目已经很久没有维护了。由于它没有维护,我现在不会使用它,但是,我认为那里实现的过滤逻辑非常可靠。

这个项目期望从客户端获取的过滤参数有些繁琐,虽然它涵盖了我能想到的大部分情况。

单个过滤器对象如下所示:

{"name": <fieldname>, "op": <operatorname>, "val": <argument>}

其中 name 可以是“first_name”、“last_name”或任何其他实体属性。op 可以是 '=='、'!=' 等,而 val 是要过滤的值。

完整请求的过滤器对象可能如下所示:

{"or": [<filterobject>, {"and": [<filterobject>, ...]}, ...]}

所以请求可能如下所示:

GET /api/person?q={"filters":[{"or":[{"name":"age","op":"==","val":10},{"name":"age","op":"!=","val":20}]}]} HTTP/1.1

我会探索他们的搜索格式文档以掌握这个想法,如果你决定这样做,我会使用提取过滤器的实际代码(因为它是开源的并且在 GitHub 中可用


推荐阅读