在查询字符串中传递“元组”以在REST API中进行过滤

问题描述 投票:0回答:1

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

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

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

我在这里看到许多选项:

  1. 添加2个列表参数"firstNameTup""lastNameTup"并询问客户端将元组"unzip"分为这两个列表,以此类推服务器将它们压缩在一起。
  2. 添加一个基于json的参数,并要求客户端创建对象列表[{"first" : "...", "last" : ""}, ...]并对其进行编码在base64字符串中。
  3. 对客户说“否”,并将从结果中筛选出“不匹配”元组的负担转移给他。

还有其他好的方法可以实现这一点吗?您有什么建议?

谢谢!

python flask api-design flask-restful query-parameters
1个回答
1
投票

我认为针对该问题有成千上万的有效解决方案(据我了解)。

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

flask-restless's方法非常灵活,但是严格,我采纳了它,即使该项目已经很长时间没有维护了。由于尚未维护,因此我现在不再使用它,但是,我认为在此实现的过滤逻辑非常可靠。

尽管该项目涵盖了我能想到的大多数情况,但该项目希望从客户端获得的过滤参数有些麻烦。

单个过滤器对象看起来像这样:

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

名称可以是“ 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

我将探索他们的search-format documentation以便理解这个想法,如果您决定这样做,我将使用提取过滤器的实际代码(因为其开源和available in GitHub

© www.soinside.com 2019 - 2024. All rights reserved.