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