rest - REST API 中嵌套资源的权限
问题描述
背景
考虑拥有 3 个资源reports
:comments
和attachments
。report
可以有很多,可以comments
有comment
很多attachments
。
此外,attachments
附加到特定的report
(在报告 -> 评论 -> 附件树中)只能由具有特定权限的用户访问report
。
问题
现在,在设计 REST API 时,我是扁平 URL 结构的粉丝,但在上述情况下,我不知道如何在不创建非常长的资源的情况下做到这一点,例如:
/reports/:id/comments/:id/attachments/:id
有什么方法可以满足这些要求(权限)并能够attachment
从像这样的平面 URL访问/attachments/:id
?
或者也许我夸大了,拥有这些长资源 URL 是完全可以的?
免责声明:我创建了一个attachments
资源(而不是report-attachments
),因为还有其他资源也需要拥有attachments
- 我不想复制结构。
解决方案
拥有这些长资源 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
来查找/计算正确的权限集,然后检查请求以查看权限是否满足。
推荐阅读
- firebird - 如何知道是否正在访问 Firebird 2.0 数据库?
- javascript - 从哈希表中的键中获取多个值
- ruby - 为什么 Digest gem 不将所有类显示为常量?
- python - LSTM Keras 功能 API 层输入形状错误
- apache-pulsar - 我们是否应该担心 Pulsar 主题中的捆绑包过多?
- ruby-on-rails - 将键值对从 ruby Hash 保存到数据库?
- android - 挂起kotlin协程异步子函数
- python - 如何使用 Pandas 系列和 numpy 数组进行矩阵乘法并始终返回一个系列?
- kubernetes - 当我尝试使用 kubectl 连接 GKE 集群时出现连接问题
- android - 为什么我的场景中的矢量图形对象在我的游戏的 android 版本中被放大但在 mac 版本中没有被放大?