如何为运行树状数据的RESTful服务构造URI?

时间:2011-05-25 10:40:51

标签: rest data-structures tree

假设我有树状数据,例如“文件”和“文件夹”,基本操作是“列表文件夹”,“创建文件夹”,“重命名”,“创建文件”,“获取文件”。

那么如何为RESTful服务构建URI呢?我尝试了几次,但所有解决方案对我来说都不是很好。

例如,如果我有URI“http://example.com/rest/here_path_to_folder”引用的“文件夹”资源,我该如何列出文件夹项?从此文件夹中获取“文件”?

我见过亚马逊AWS文档,他们使用的不是非常干净的方法 - 传递“文件夹”路径和文件夹分隔符作为查询参数,这可能会导致歧义,因为不同的URI将引用相同的资源。此外,我尝试在路径末尾添加关键字,因此列出“文件”看起来像:

GET /rest/path/to/folder:list HTTP/1.1

重命名:

POST /rest/path/to/folder:rename?target=NEW_NAME HTTP/1.1

但它对我来说仍然很糟糕。那么你知道在层次数据上使用100%REST的任何成功案例吗?

1 个答案:

答案 0 :(得分:2)

我认为使用URI来表示层次结构数据结构应该非常简单。虽然URI并不严格意味着层次结构(有些人喜欢保持完全不透明),但有意义的URI确实具有自然的层次感,并且它们应该很好地映射到您的文件/文件夹示例。

在RESTful系统中,资源有一个公共接口(在您的情况下)由HTTP谓词定义。 URI标识资源,REST指示它不应用于指示您尝试执行的操作。

所以而不是

GET /rest/path/to/folder:list HTTP/1.1

我建议您列出文件夹的内容(找出它的状态),你只需使用:

GET /rest/path/to/folder HTTP/1.1

这应返回一个URI列表,表示此文件夹包含的文件和子文件夹。然后,为了获取其中一个文件的内容,我可能会调用:

GET /rest/path/to/folder/myfile HTTP/1.1

重命名有点棘手。在某些情况下,DELETE后跟PUT会有效,但我猜你想要保留文件夹内容而不必重新上传。一个选项是PUT,其中正文包含一个新的文件夹路径,它以204响应并且Location头值指向新创建的文件夹(如'重命名标记'here中所述)。可选:如果您希望对用户非常友好,如果有人向旧URI发出请求,您还可以返回301状态(永久移动),其中包含指向新URI的链接。

请记住路径只是构成文件夹状态的属性之一,您可以使用PUT更新该状态,而无需引入自定义“重命名”操作。在您的情况下,您碰巧使用路径来决定您的URI,但它对状态更改完全有效,从而导致URI发生更改。