【问题标题】:REST API filtering/search on a parent resourceREST API 过滤/搜索父资源
【发布时间】:2017-03-28 11:55:46
【问题描述】:

假设我有一家商店,例如亚马逊,销售各种产品,例如 电脑绘画。它们彼此完全不同,并且有自己的一组字段和逻辑。

除了典型的 CRUD 之外,我还需要设计一个 JSON API,它允许我:

A.获取绘画计算机的未分组列表。例如:[computer, painting, painting, computer, ...] 按发布日期排序(因此具有过滤功能)。

B.只获取画作

C.仅获取计算机

RESTful 方法通常类似于:/api/paintingsapi/computers,这对于分离结果非常有效。

但我主要关心的是操作 A - 获取按出版日期排序的未分组的绘画和产品列表。在我看来,有三种方法:

1) 创建一个名为products 的新独立资源,例如/api/products,它将具有过滤功能并继续使用/api/resource 进行特定的CRUD 操作。

2) 创建一个父 products 资源,用于过滤操作。所以我可以做/products?order_by=published_date之类的事情,对于更具体的资源,我可以做/products/paintings/products/computers之类的事情

3) 没有绘画计算机的资源。取而代之的是一个通用的product。然后我会在 api 层拥有大部分逻辑,并降低客户端的复杂性。

我倾向于方法 #3,但希望在实施之前获得反馈,因为这将是 API 的核心功能。

【问题讨论】:

    标签: rest api json-api


    【解决方案1】:

    我一直采用 API 层应与对象建模相匹配的方法。因此,您的问题的答案将取决于源数据。嗯,对象建模后的源数据。

    如果您有计算机和打印机的对象模型,它们应该是您所说的资源。他们是否共享任何数据/功能?如果是这样,您也应该有一个对象模型,也许是:产品。然后 Computer 和 Printer 扩展 Product 类。

    考虑到这一点,设计 API 层来反映它。由于计算机和打印机都扩展了产品。产品作为计算机和打印机资源的父级是有意义的。

    【讨论】:

      【解决方案2】:

      在我看来,如果您搜索它,我会选择方法 #3 并使用产品类型查询 API。

      /products?type=computers&order_by=date
      

      【讨论】:

      • 如果产品的类型(计算机或绘画)只是一个属性,我也会推荐这种方法。在这种情况下,对象模型将只包含一个类:Product。然而,正如科比解释的那样,计算机和绘画是截然不同的对象,每个都有自己的属性和功能。因此,对象模型中有三个类:计算机、绘画和产品。前两者扩展了后者。编写 API 层来镜像对象模型可以让未来的扩展/修改和维护代码更容易。
      • @Tim 我可能遗漏了一些东西,但这不是在方法#3 中完全反映的吗?
      • 是的,它反映在方法 #3 中。问题是“我应该使用其中哪一个?”我的回答是“这取决于你的对象模型”。在这种情况下,它是#3,但“#3”不是我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2019-11-08
      • 2017-10-19
      • 1970-01-01
      • 2015-11-30
      • 2019-07-01
      相关资源
      最近更新 更多