RESTAPI如何对需要维护特定顺序的资源建模 我们正在为我们的API设计一个新的特性,我们遇到了一个两难的问题。

RESTAPI如何对需要维护特定顺序的资源建模 我们正在为我们的API设计一个新的特性,我们遇到了一个两难的问题。,api,rest,resources,Api,Rest,Resources,我们有两种不同类型的资源,具有1-N关系。 表示和层。 表示可以包含多个图层。一个图层只能属于一个表示。 我们所遇到的问题是,我们需要为表示中的层维护一个顺序 PUT /Representations/{repID}/layersorder 我们提出了两种方法: 第一种方法:链表 每一层都知道它的前一层。在DB中,这是通过在Layers表中包含另一层id的“parent”字段来实现的。第一层的“父层”将设置为NULL 然后通过以下URI通过API公开: 创造 GET /Representati

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

PUT /Representations/{repID}/layersorder
我们提出了两种方法:

第一种方法:链表

每一层都知道它的前一层。在DB中,这是通过在Layers表中包含另一层id的“parent”字段来实现的。第一层的“父层”将设置为NULL

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

创造

GET /Representations/{repID}/layers
获取表示的所有层。通过遍历所有层并查看父字段,可以计算出顺序

POST /Representations/{repID}/layers
正文: 标签:(字符串) 父:分层

这用于通过在请求正文中指定父对象,在特定位置创建和插入层。如果将Parent设置为NULL,则新创建的层将是顺序中的第一个层。 如果省略父字段,新创建的图层将位于订单底部。 问题在于,在响应中,我们需要通知api使用者,由于新的插入,其他层的顺序已经改变

更新

PUT /Representations/{repID}/layers/{layerId}
正文: 标签:(字符串) 父:分层 同样,您可以指定一个新的父对象来重新排序该层,我们还需要发回有关所有其他已更改层的信息

删除

DELETE /Representations/{repID}/layers/{layerId}
需要发回有关所有其他已更改层的一些信息

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

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

因此,您仍然可以使用层的CRUD功能: GET-POST-PUT-DELETE

但是,如果您想了解他们的订单,或者想更改他们的订单,您将使用以下uri:

/Representation/{repId}/layersorder
此资源仅支持两种方法

GET /Representations/{repID}/layersorder
获取此表示形式中图层ID的有序列表

PUT /Representations/{repID}/layersorder
正文: []-新顺序中的层ID阵列。 更新图层的顺序。您需要以新的顺序传递层ID数组作为请求主体。(例如[1,3,2,4,6,5])

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

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


谢谢。

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

当执行影响实体的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完成了这项工作,它似乎对用户非常有用。

嗨,Ryan,也许我对这个问题不太清楚,但是使用第二种方法,您不必发送所有表示数据。要对层进行重新排序,您只需将
放入
/representations/{repId}/layersorder
,请求的主体将是
[10,22,33,11,67]
,这是一个层ID的有序数组。刚刚找到这个关于有序集合的WebDAV草稿。他们似乎提出了一种ORDERPATCH方法,通过将每个集合成员的新位置指定为first、last、before和after,可以对集合重新排序。