假设我有树状数据,例如“文件”和“文件夹”,基本操作是“列表文件夹”,“创建文件夹”,“重命名”,“创建文件”,“获取文件”。
那么如何为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的任何成功案例吗?
答案 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发生更改。