访问自己/自己的对象的 REST API 最佳实践
Posted
技术标签:
【中文标题】访问自己/自己的对象的 REST API 最佳实践【英文标题】:REST API Best Practice For Accessing Self/Own Objects 【发布时间】:2020-09-13 20:33:34 【问题描述】:假设我正在创建一个日记应用程序,我希望用户能够将条目发布到他们的日记中。
我不打算让用户(甚至是版主)在其他人的日记中发布条目。
也就是说,是否有任何论据可以在我的端点路径中公开帐户或日志 ID?
我认为POST api/journals/postEntry
就足够了,因为我可以通过访问令牌或 JWT 令牌确定用户。
谁能想到在路径中提供 journalId 的论据?例如:POST api/journals/user journalId/postEntry
【问题讨论】:
【参考方案1】:谁能想到在路径中提供 journalId 的论据?例如:POST api/journals/user journalId/postEntry
简短回答:这违反了统一接口约束。
见Fielding, 2000。
实际上,您所做的是创建世界的这个小角落,而不是使用 target-uri 来识别资源,而是使用 target-uri + token。
这意味着你的东西没有使用世界上通用组件所期望的语义。
例如,当我从我的用户代理中复制 URI 并与其他人共享时,其他人不会得到我期望的结果 - 他们最终会查看 他们的查看,不是我的。
我们可以在电子邮件消息中粘贴一个 URI 并让它只为阅读电子邮件的人工作这一事实是采用故事中的一个非常重要的部分。
此外,REST 中的cache constraint 依赖于能够将标识符用作主缓存键。因此,您的定制身份机制可能会破坏缓存。
实践中:您正在使用 HTTP,并且 HTTP 具有 prohibit sharing authenticated 请求的缓存规则。所以上面提到的缓存问题纯属理论。
您可能会考虑的替代方案
你可以安排/api/journals/postEntry
到redirect到/api/journals/userJournalId/postEntry
您可以使用Content-Location 标头来指示当前表示存在更具体的标识符。
您可以使用canonical link relation 帮助客户从备选方案中导航到首选资源。
【讨论】:
以上是关于访问自己/自己的对象的 REST API 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
JHipster:如何限制用户使用 REST 访问自己的数据