首页 > 解决方案 > REST API 中嵌套资源的权限

问题描述

背景

考虑拥有 3 个资源reportscommentsattachmentsreport可以有很多,可以commentscomment很多attachments

此外,attachments附加到特定的report(在报告 -> 评论 -> 附件树中)只能由具有特定权限的用户访问report

问题

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

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

有什么方法可以满足这些要求(权限)并能够attachment从像这样的平面 URL访问/attachments/:id

或者也许我夸大了,拥有这些长资源 URL 是完全可以的?

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

标签: restapipermissionsapi-design

解决方案


拥有这些长资源 URL 完全可以吗?

拥有任何类型的资源 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 中。

有没有办法满足这些要求(权限)并能够从像 /attachments/:id 这样的平面 URL 访问附件?

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


推荐阅读