我们正在为我们的 API 设计一个新功能,但我们偶然发现了一个两难境地。
我们有两种具有 1-N 关系的不同类型的资源。表示和层。一个表示可以包含多个层。一个层只能属于一个表示。我们坚持的事情是我们需要维护表示中层的顺序。
我们提出了两种方法:
第一种方法:链表
每个层都知道它的前一层。在数据库中,这是通过在 Layers 表中包含另一个 Layer 的 id 的“父”字段来实现的。第一层将有一个“父”设置为 NULL。
然后通过以下 URI 通过 API 公开:
创造
GET /Representations/{repID}/layers
获取表示的所有层。可以通过遍历所有层并查看父字段来确定顺序。
POST /Representations/{repID}/layers
正文:标签:(字符串)父级:LayerId
这用于通过在请求正文中指定父级来在特定位置创建和插入层。如果将 Parent 设置为 NULL,则新创建的 Layer 将是顺序中的第一个 Layer。如果省略父字段,新创建的图层将位于订单的底部。问题在于,在响应中,我们需要通知 api 使用者其他层由于新的插入而改变了顺序。
更新
PUT /Representations/{repID}/layers/{layerId}
body: Label: (string) Parent: LayerId 同样,您可以指定一个新的 Parent 来重新排序该层,并且我们需要再次发回有关所有其他已更改层的信息。
删除
DELETE /Representations/{repID}/layers/{layerId}
需要发回有关所有其他已更改层的信息。
第二种方法:Layers Order 作为自己的资源
这个想法是层本身没有顺序的概念。它们只是一种资源。然后你会得到一个 layersorder 资源,它负责保存有关层顺序的信息。
所以你仍然有图层的 CRUD 功能:GET - POST - PUT - DELETE
但是当你想知道他们的订单,或者你想改变他们的订单时,你会使用下面的 uri:
/Representation/{repId}/layersorder
此资源将仅支持两种方法
GET /Representations/{repID}/layersorder
取回此 Representation 中的 Layers Id 的有序列表。
PUT /Representations/{repID}/layersorder
body: [] - 新顺序的图层 ID 数组。更新图层的顺序。您需要以新的顺序传递一个 Array of Layers id 作为请求的主体。(例如 [1,3,2,4,6,5] )
按照第一种方法,无论何时添加或删除图层,都需要通知 api 使用者另一个资源已更新。在第一种方法中是受更改影响的层列表,在这种方法中是层的新顺序(layersorder 资源)。
我想听听意见以及类似情况的示例以及您如何解决问题。
谢谢。