对 REST 中嵌套资源的权限 API

Permissions to a nested resource in REST API

背景

考虑拥有 3 个资源:reportscommentsattachmentsreport可以有多个commentscomment可以有多个attachments.

此外,附加到特定 reportattachments(在报告 -> 评论 -> 附件树中)只能由有权访问特定 [=14] 的用户访问=].

问题

现在,我在设计 REST API 时喜欢扁平 URL 结构,但在上述情况下,我不知道如何在不创建非常长的资源的情况下做到这一点,例如:

/reports/:id/comments/:id/attachments/:id

有什么方法可以满足这些要求(权限)并能够从像 /attachments/:id 这样的 URL 公寓到达 attachment

或者我可能在夸大其词,拥有这种长资源完全没问题 URLs?

免责声明:我创建了一个 attachments 资源(而不是 report-attachments),因为还有其他资源也需要 attachments - 我没有'要复制结构。

it's totally ok to have these kinds of long resource URLs?

拥有任何类型的资源URL都是完全可以的。 REST 不关心您如何拼写资源标识符——这就是重点。所以如果你需要一个日志URL因为服务器需要把很多信息编码进去,那很好。

如果您担心长度,可以去掉语义提示

/reports/:id/comments/:id/attachments/:id
/reports/:id/c/:id/a/:id
/reports/:id/:id/:id
/:id/:id/:id

其中一些拼写对于您在服务器上使用的路由框架来说会更容易,但这是您控制的实现细节。

没有规定必须将信息直接编码到标识符中; URL 缩短器 有效 .

在HTML中,我们还可以通过表单从客户提供的信息中构造(某些)标识符。这是因为 HTML 媒体类型的定义包含处理规则,这些规则描述了如何将表单数据组装成包含在查询部分中的 application/x-www-form-urlencoded 表示形式。

所以你可以在你自己的媒体类型中引入类似的机制。

还有 RFC 6570,它描述了 URI 模板。这为您提供了另一种与客户沟通的方式,即如何将信息编码为 URL.

Is there any way to meet these requirements (permissions) and be able to reach the attachment from a flat URL like /attachments/:id?

当然可以。您只需要能够使用 :id 查找/计算正确的权限集,然后检查请求以查看是否满足权限。