python - 在查询字符串中传递“元组”以在 REST API 中进行过滤
问题描述
我有一个基于 Flask 的 GET Api 端点,允许获取员工信息。
我们的客户要求在“名字”和“姓氏”字段中添加“元组”列表过滤参数,以便他可以指定名字元组 - 例如:[("Ben","Long"), ("John", "Miller"), ....]
结果不应显示像 ("Ben","Miller") 或 ("John","Long") 这样的记录,因此这些字段需要在查询参数中以某种方式互连。
我在这里看到了许多选项:
- 添加 2 个列表参数
"firstNameTup"
,"lastNameTup"
并要求客户端将元组“解压缩”到这两个列表中,以便在服务器上将它们压缩在一起。 - 添加一个基于 json 的参数并要求客户端创建一个对象列表
[{"first" : "...", "last" : ""}, ...]
并将它们编码为 base64 字符串。 - 对客户说“不”,并将过滤掉“不匹配”元组的负担从结果转移给他。
有没有其他好的方法来实现这个?你的建议是什么?
谢谢!
解决方案
我认为该问题有数千种有效的解决方案(据我所知)。
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 中可用)
推荐阅读
- java - 如何在不使用括号的情况下解决这个问题?
- python - PyTorch:_thnn_nll_loss_forward 没有为 torch.LongTensor 类型实现
- r - 使用 R 从 ugarchboot 输出中提取预测区间
- google-drive-api - 如何使用 PyGSheets v2 在特定文件夹/目录中创建新工作表?
- autodesk-forge - Forge Properties - 如何识别返回的集合
- mybatis - 如何从 Mybatis 获取 db 列值进行分片?
- ios - WCSession 检查配套应用程序是否可以接收消息
- c# - 如何使用字符串生成器以表格格式应用
- java - ElasticSearh RestHighLevelClient ,如何添加重试?
- python-3.x - 是否还创建了内置模块的 pyc 文件?