【问题标题】:API (REST) Filtering table names, complex queriesAPI (REST) 过滤表名、复杂查询
【发布时间】:2015-12-31 16:31:46
【问题描述】:

我正在创建用于从移动客户端 Android 和 iOS 消费(这次)的 API。主要应用是一种电子商店。

我有 news 端点,让我们考虑例如主 url 是 http://consumer.com/api/v0/

目前我有这样的端点来过滤新闻/news?actual=1&moderation=1 ....

GET 参数的简单数组,但我对此有一些疑问。坏事(我认为是这样)是过滤器参数(actual,moderation)与数据库中的列名相同。

  1. 公开真实的列名是个坏主意吗?
  2. 我该如何解决这个问题?我有一个想法是引入一些中间件(无论如何都是可能的,但我使用 lumen 很有可能)会将一些假名称例如 filter_actualfilter_mooderation 转换为真实的表名,这不会破坏我的应用程序现在,只需添加一层(中间件的力量)。或者还有另一种方法可以做到这一点。

但主要问题是,如果我需要执行复杂的查询,请考虑下一个示例。

news 有列company_idcompany 表有列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。

但首先对我来说它看起来很丑,因为它是获取请求中相当复杂的查询,但对我来说主要的不好的一面是我需要确切地知道表名,表列,现在这不是问题,因为此API仅用于移动客户端通信,不会公开开放,但我还是想做可靠的API

  1. 像我之前描述的那样是个坏主意吗?
  2. 如何组织我的 API 使其灵活(API 的更改应尽可能减少对前端的影响)

请更高级的 API 开发人员提出对我来说最好的选择。

谢谢。

【问题讨论】:

    标签: php android api rest http


    【解决方案1】:

    公开真实的列名是个坏主意吗?

    是不错的主意。开发人员最好了解到底发生了什么。我会给出正确的名称而不是直接的列名。亚马逊和谷歌的许多 API 都在做同样的事情。

    我该如何解决这个问题?我有一个想法是引入一些中间件(无论如何都是可能的,但我使用 lumen 很有可能)会将一些假名称(例如 filter_actual 和 filter_mooderation)转换为真实的表名,这不会破坏我的应用程序,只需添加多一层(中间件的力量)。或者还有其他方法可以做到这一点。

    很多时候开发人员不喜欢在 Get 响应中发送正文,但如果您觉得它会更复杂并破坏应用程序。我建议这样做。这是您拨打电话之前的详细讨论HTTP GET with request body

    您可以添加许多验证以使 API 更强大并处理不同的请求场景。

    【讨论】:

    • 感谢您的回答,如何组合来自不同表的过滤器以形成复杂的查询,可以使用/news?actual=1&moderation=1&blocked[companies:company_id]=0 并且我不想从 GET 发出 POST 请求,获取参数就足够了实现我的目标
    • 此外,使用 GET 请求发送正文比使用长查询字符串(顺便说一句不会那么长)更丑陋,例如示例 +- 2 个参数
    • 实际上暴露真实的列名是个坏主意,payloads和model应该分开。谷歌或亚马逊直接公开他们的模型这一事实并不是一个争论,因为这些都是大型组织并且可以更改 API,他们制定了规则。
    • 一切都与团队决策和您想如何做有关:)。在这里,我们遵循相同的,所有安全测试团队从未提交任何错误。在撰写此评论之前,我在 Jira 中搜索了几分钟。
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多