首页 > 解决方案 > 访问自己/自己的对象的 REST API 最佳实践

问题描述

假设我正在创建一个日记应用程序,并且我希望用户能够将条目发布到他们的日记中。

我不打算让用户(甚至是版主)在其他人的日记中发布条目。

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

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

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

标签: restauthorizationjwt-auth

解决方案


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

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

参见菲尔丁,2000 年

实际上,您所做的是创建世界的这个小角落,而不是使用 target-uri 来识别资源,而是使用 target-uri + token。

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

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

我们可以在电子邮件消息中粘贴一个 URI 并让它只为阅读电子邮件的人工作这一事实是采用故事中的一个非常重要的部分。

此外,REST 中的缓存约束更依赖于能够将标识符用作主缓存键。因此,您定制的身份机制有可能会破坏缓存。

实践中:您正在使用 HTTP,并且 HTTP 具有禁止共享经过身份验证的请求的缓存规则。所以上面提到的缓存问题纯粹是理论上的。

您可能会考虑的替代方案

  • 您可以安排重定向/api/journals/postEntry/api/journals/{userJournalId}/postEntry
  • 您可以使用Content-Location标头来指示当前表示存在更具体的标识符。
  • 您可以使用规范链接关系来帮助客户从备选方案导航到首选资源。

推荐阅读