RESTful重新排序嵌套对象

问题描述 投票:3回答:3

我有一个支持两个对象的RESTful API,因此对象A包含嵌套对象的有序列表B

Create object A               - POST  /a
Create object B and add to A  - POST  /a/<id>/b
Update object B in A          - PATCH /a/<id>/b/<id>

什么是RESTful方式来更新特定BA对象的顺序?

选项1:带有json内容的PATCH /a/<id>替换A.Bs A有一个嵌入的Bs列表,即A.Bs,所以你可以完整地替换该列表,也可以改变路上的顺序。这依赖于客户端正确地重新提交整个列表。

选项2:PATCH /a/<id>用json内容替换A.B_order 添加一个单独的B ID列表,让客户端更新它。这与选项1类似,但不依赖于客户端重新提交所有对象。它确实需要服务器管理列表,在B创建时更新它,并验证更新包含列表顺序更新所需的所有B ID。

选项3:PATCH /a/<id>/b用json内容替换A.Bs 与选项1相同,但使用不同的URL

哪个最RESTful且最清晰? 还有其他选择吗?

rest http nested restful-url restful-architecture
3个回答
2
投票

我建议使用RFC 6902中定义的建议标准。具体来说,“移动”操作似乎是您正在寻找的。


0
投票

鉴于Foo有条和条是资源(有ID或链接),当你需要重新排序foo.bars然后我会建议:

'PUT / food /:in / bars',包含身体中的ID或链接数组。

但如果Bars不是资源(没有ID),那么:

'PATCH / food /:'是'与食物的主体,包括'bars'属性中全新的Foo.bars。


0
投票

我会问自己的问题是:“在这种情况下'命令'意味着什么”。

B的具体实例之间没有订单。它们都是并非真正“了解”每个订单的独立资源。

鉴于此,它并不是你正在改变的B资源。你在改变什么?

据推测,有一些B的集合。你对该集合做了一个GET请求,以获得B的有序列表。你在/a/<id>/a/<id>/b上得到那份名单吗?

无论有序列表在哪里,我也会执行更改订单的操作,因为订单是集合的“属性”。

因此,为了论证,让我们假设你的'B集合生活在/a/<id>b。这应该是什么格式?

好吧,一个好的REST服务将取代整个州。因此,作为默认情况,我会在该资源上执行PUT请求,并完全替换整个事物。

如果你不喜欢这个想法,并想使用PATCH只更新集合的一部分(没有别的),我想我会选择其中一个:

  1. 使用标准格式,如json-patch
  2. 用你自己的语法来描述这个。

选项2的实现可能要简单得多,我也会尽可能简化格式。

如果使用像HAL这样的格式,则集合可能是链接列表。在这种情况下,我会使用如下语法:

{
  "_links": {
     "item": [
        { "href": "/a/<id>/b/ordered-item-1" },
        { "href": "/a/<id>/b/ordered-item-2" }
      ]
  }
}

如果您没有超媒体样式的API,则可能使用id并强制客户端在URL中展开id。在这种情况下,我想这个格式可能是这样的:

{
   "items": [ 1, 3, 5, 2]
}

在每种情况下,为此定义您自己的媒体类型是个好主意,因为PATCH的这种格式对您的api具有特殊意义。例如:

application/vnd.jonathan.patch+json
© www.soinside.com 2019 - 2024. All rights reserved.