我有一个基于Flask的GET Api端点,可用于获取员工信息。
我们的客户要求在“名字”和“姓氏”字段上添加一个“元组”列表过滤器参数,因此他可以指定姓氏元组-例如:[("Ben","Long"), ("John", "Miller"), ....]
结果应不显示记录,例如(“ Ben”,“ Miller”)或(“ John”,“ Long”),因此这些字段需要以某种方式在查询参数中互连。
我在这里看到许多选项:
"firstNameTup"
,"lastNameTup"
并询问客户端将元组"unzip"分为这两个列表,以此类推服务器将它们压缩在一起。[{"first" : "...", "last" : ""}, ...]
并对其进行编码在base64字符串中。还有其他好的方法可以实现这一点吗?您有什么建议?
谢谢!
我认为针对该问题有成千上万的有效解决方案(据我了解)。
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)