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

假设我有树状数据,例如“files”和“folders”,基本操作是“list folder”,“create folder”,“rename”,“create file”,“fetch file”.

那么如何为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的任何成功案例吗?

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

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

而不是

GET / rest / path / to / folder:列出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更改的状态更改它是完全有效的.

点赞