我正在创建用于从Android和iOS移动客户端消费(此时)的API。主要应用是一种电子商店。
我有news
个端点,让我们考虑一下主网址是http://consumer.com/api/v0/
目前我有这样的端点来过滤新闻/news?actual=1&moderation=1 ....
简单的GET
参数数组,但我对此有一些疑问。坏事(我认为是这样)是过滤器参数(actual,moderation
)与数据库中的列名相同。
filter_actual
和filter_mooderation
)转换为真实的表名,这将现在不要制作我的应用程序,只需再添加一层(中间件的功能)。或者还有另一种方法可以做到这一点。 但主要问题是如果我需要执行复杂查询,请考虑下一个示例。
表news
包含列company_id
,company
表包含列blocked
,此列描述公司是否被阻止。
我需要通过未被阻止的公司获取所有新闻,我已执行类似此伪查询SELECT * FROM news WHERE company_id IN (SELECT id FROM companies WHERE blocked=0)
的事情(我没有检查但我希望你有个主意)
如何为此类查询制作端点过滤器,现在我已经引入了其他选项,如non_blocked_companies
,然后传入其他过滤器/news?actual=1&moderation=1&non_blocked_companies=1
,然后检查此参数是否与其他人一起传递代码很快就会看起来像每个复杂查询特定的很多if
语句。
我考虑过这样的问题/news?actual=1&moderation=1&blocked[companies:company_id]=0
我认为很清楚。我使用来自其他表(companies
)的字段news
表(company_id
)中存储公司ID的列。
但是对我来说它看起来很难看,因为它在get请求中是一个相当复杂的查询,但对我来说这个主要的坏处是我需要确切地知道表名,表列,现在不是问题,因为此API仅用于移动客户端通信,不会公开打开,但我想制作可靠的API
请更高级的API开发人员,建议它是我的最佳选择。
感谢。
答案 0 :(得分:1)
公开真实的列名是不是一个好主意?
是不是坏主意。开发人员了解究竟发生了什么是一件好事。我会给出正确的名称,而不是直接的列名。亚马逊和谷歌有许多API做同样的事情。
我该如何解决这个问题?我有一个想法是介绍一些中间件(无论如何,它是可能的,但我使用流明很有可能),将一些假名称,例如filter_actual和filter_mooderation转换为真实的表名,这不会现在制动我的应用程序,只需添加一层(中间件的力量)。或者还有另一种方法可以做到这一点。
很多时候开发人员不喜欢在Get响应中发送body,但是如果你觉得它会更复杂并且破坏应用程序。我建议那样做。在您致电HTTP GET with request body
之前,请详细讨论您可以添加许多验证以使API更强大并处理不同的请求方案。