REST API 如何对需要维护特定顺序的资源进行建模



我们正在为我们的API设计一个新功能,我们偶然发现了一个困境。

我们有两种不同类型的资源,具有 1-N 关系。制图表达和图层。一个制图表达可以包含多个图层。一个图层只能属于一个制图表达。我们坚持的问题是,我们需要维护表示中图层的顺序

我们想出了两种方法:

第一种方法:链表

每个层都知道其前一层。在数据库中,这是通过在图层表中有一个包含另一个层 id 的"父"字段来实现的。第一个图层的"父级"将设置为 NULL。

然后,通过以下 URI 通过 API 公开:

创造

GET /Representations/{repID}/layers

获取表示的所有图层。可以通过遍历所有图层并查看"父"字段来计算顺序。

POST /Representations/{repID}/layers

身体: 标签:(字符串) 父级:层 ID

这用于通过在请求正文中指定父级来创建和插入特定位置的层。如果将父图层设置为 NULL,则新创建的图层将是顺序中的第一个图层。如果省略父字段,则新创建的图层将位于订单的底部。这样做的问题是,在响应中,我们需要通知 api 消费者,由于新的插入,其他层的顺序发生了变化。

更新

PUT /Representations/{repID}/layers/{layerId}

身体: 标签:(字符串) 父级:层 ID同样,您可以指定一个新的父级来重新排序图层,同样,我们需要发回有关所有其他已更改图层的信息。

删除

DELETE /Representations/{repID}/layers/{layerId}

需要发回有关所有其他已更改图层的一些信息。

第二种方法:层序作为自己的资源

这个想法是层本身没有秩序的概念。它们只是一种资源。然后你得到一个layersorder资源,它负责保存有关层顺序的信息。

因此,您仍将拥有层的 CRUD 功能:获取 - 发布 - 放置 - 删除

但是,当您想知道有关其顺序的任何信息或想要更改其顺序时,您将使用以下 URI:

/Representation/{repId}/layersorder

此资源仅支持两种方法

GET /Representations/{repID}/layersorder

获取此表示中图层 ID 的有序列表。

PUT /Representations/{repID}/layersorder

身体: [] - 按新顺序排列的图层 ID 数组。更新图层的顺序。您需要以新顺序传递层数组 ID 作为请求的正文。(例如 [1,3,2,4,6,5] )

根据第一种方法,无论何时添加或删除层,都需要通知 API 使用者另一个资源已更新。在第一种方法中,受更改影响的层列表,在这种方法中是层的新顺序(层顺序资源)。

我想听听意见和类似情况的例子以及您如何解决问题。

谢谢。

我已经体验了你所描述的部分内容。

当执行影响一个或多个实体的 PUT/POST 时,我喜欢在更改后返回完整的对象。希望返回对象不是很大,但是如果我使用您的 API,则使用第一种方法......我会喜欢做一个 PUT/POST 并更新一个图层,然后返回包含更新的图层信息的完整表示对象。

它只是让我可以轻松确认我的更改,并立即开始使用新结构在我的代码中工作。我不喜欢做 PUT/POST,然后必须做一个额外的 GET 才能看到变化。

对于第二种方法...我做的工作越多,进行 API 调用,我就越沮丧。我不确定我是否读对了,但是要使用第二种方法进行PUT操作,似乎我必须构造整个表示和图层对象才能更新一条数据。那将是令人沮丧的。

我更喜欢第一种方法的语法,但使用第二种方法的概念。换句话说,这是我希望在 PUT/POST/GET 之后看到的文档:


{
   "type" : "Representation",
   "id" : 1,
   "layers" : [
      { "id" : 1, "name" : "the first layer", "order" : 1, "parent" : "" },
      { "id" : 2, "name" : "the second layer", "order" : 2, "parent" : 1 },
      { "id" : 3, "name" : "the third layer", "order" : 3, "parent" : 1 }   
   ]
}

它已经为我排序了,所以我不必做这项工作,但也具有用于生成排序的信息以防万一。我已经使用 REST API 完成了此操作,它似乎对用户非常有用。

相关内容

  • 没有找到相关文章

最新更新