REST API 访问 Self/Own 对象的最佳实践

REST API Best Practice For Accessing Self/Own Objects

假设我正在创建一个日记应用程序,我希望用户能够 post 进入他们的日记。

我永远不会允许用户(甚至版主)post 在其他人的日志中添加条目。

也就是说,是否有关于在我的端点路径中公开帐户或日志 ID 的任何论据?

我认为 POST api/journals/postEntry 就足够了,因为我可以通过访问令牌或 JWT 令牌确定用户。

谁能想到在路径中提供 journalId 的论点?例如:POST api/journals/{user journalId}/postEntry

Can anyone think of arguments for providing the journalId in the path? EX: POST api/journals/{user journalId}/postEntry

简答:这违反了统一接口约束。

Fielding, 2000

实际上,您正在做的是创建世界的这个小角落,您不是使用 target-uri 来标识资源,而是使用 target-uri + 令牌。

这意味着您的东西没有使用世界上通用组件所期望的语义。

例如,当我从我的用户代理中复制 URI 并与其他人共享时,其他人没有得到我期望的结果——他们最终会查看 他们的 观点,不是我的。

事实上,我们可以在电子邮件中添加一个 URI 并让它只对阅读电子邮件的人有效,这在采用故事中是一个非常重要的部分。

此外,REST 中的 cache constraint 更依赖于能够将标识符用作主缓存键。所以你定制的身份机制有可能搞乱缓存。

实践:您正在使用 HTTP,并且 HTTP 具有 prohibit sharing authenticated 请求的缓存规则。所以上面提到的缓存问题纯属理论

您可能会考虑的备选方案

  • 你可以安排 /api/journals/postEntryredirect/api/journals/{userJournalId}/postEntry
  • 您可以使用 Content-Location header 来指示当前表示有更具体的标识符。
  • 您可以使用 canonical link relation 帮助客户从备选资源导航到首选资源。