树结构的REST URI设计

gre*_*g3z 10 rest tree uri

有很多关于REST URI设计的讨论,但没有一个回答我的问题.

假设我有一些包含任务和/或其他列表的列表(list = node和task = leaf).

我们可以有类似的东西

/lists/{id_list1}/lists/{id_list2}/lists/{id_list3}/tasks/{id_task1} 
Run Code Online (Sandbox Code Playgroud)

或者更简短的版本:

/lists/{id_list1}/{id_list2}/{id_list3}/{id_task1}
Run Code Online (Sandbox Code Playgroud)

但真正的深树呢?

我也在考虑可以翻译的父/子关系

/lists/{id_list_parent}/{id_list_or_task_child} 
Run Code Online (Sandbox Code Playgroud)

但我觉得有些东西不见了......

什么是REST URI树的智能设计?

编辑

对不起,我迟到了!

所以我认为我混合了两个需求:API URI和浏览器URI.

这是我看到的东西:

在API方面,我只有那些写入和读取方法的URI(例如,对于创建而言,不需要末尾的'/ id'):

/lists/id
/tasks/id
Run Code Online (Sandbox Code Playgroud)

然而,在我的浏览器上,我会有这样的事情:

/lists/id/lists/id/tasks/
Run Code Online (Sandbox Code Playgroud)

服务器只会解释第一部分(/ lists/id),我的客户端javascript将使用第二部分(lists/id/tasks /)来查找从服务器接收的列表子列表的任务.

你怎么看待这种方法,它有什么不妥之处吗?

Wil*_*ung 10

是否需要通过URI表示树?当它们可以简单地引用节点本身时,关系通过超媒体类型中的链接建模.

除此之外,我认为如下:

/lists/{nodeId}/children
Run Code Online (Sandbox Code Playgroud)

它可以将直接子项列表返回给父项.

你也可以这样做:

/lists/{nodeId}/children?depth=3
Run Code Online (Sandbox Code Playgroud)

并在结果中返回树的下三个级别.

/lists/{nodeId}/children?depth=infinite
Run Code Online (Sandbox Code Playgroud)

可以从该节点返回整个分支.


his*_*ess 0

使用 URI 来强制执行此约束似乎不正确。我会接受具有某种有效负载(JSON、XML 等)的 PUT 请求。

PUT /tasklist

lists: [{
   id: 1234,
   id: 12345,
   tasks: [{
      id: foo,
      id: bar,
      id: baz
   }]
}]
Run Code Online (Sandbox Code Playgroud)

该 URL 似乎表明您试图在这里做太多事情(恕我直言)。通常,您将与单个资源进行交互,而您的用例意味着您同时对多个上下文分层的资源进行操作。