http - REST:处理部分受限资源的正确方法
问题描述
我正在为我构建的一个小型 SaaS 重新设计 REST API。目前有一条/entries
不需要任何身份验证的路由。但是,如果客户端以足够的权限进行身份验证,服务器将发送附加信息(例如:与每个条目关联的帐户)。
我看到的主要问题是,尝试请求权限不足的受保护数据的客户端仍然会收到 200 响应,但没有预期的数据,而不是 401 Unauthorized。
我想出的替代方案是:
将端点拆分为两个端点 ex
/entries
和/admin/entries
. 这种方法的问题在于,现在对于本质上相同的资源有两个不同的端点。但是,它具有易于使用 OpenAPI 记录的优点。(此外,它允许添加/entries/:id/account
端点。)接受查询参数
?admin=true
。这个选项更难记录。另一方面,它避免了单个条目有多个 URI。
有没有一种标准的方法来构建这样的东西?
相关问题:同一资源的不同 RESTful 表示
解决方案
我想出的替代方案是
请注意,就 HTTP/REST 而言,您的两种选择是相同的:在这两种情况下,您都在引入新资源。
在一种情况下您使用路径段来区分两个标识符,而在另一种情况下您使用查询部分这一事实并没有改变您拥有两个资源的事实。
拥有具有相同信息的两个资源很好- 想象两个由相同信息构建的网页。
这是一种权衡——HTTP 应用程序不会知道这些资源具有公共信息,因此不会知道使一个缓存资源无效也会使另一个资源无效。因此,就像网页一样,您可能会遇到缓存中的表示彼此不一致的情况。
有时,正确的答案是使用不同资源之间的链接——将“该”信息放在一个地方,而其他任何地方都有可以让您找到那个地方的链接。再次,权衡。
HTTP 不是一个无限灵活的应用程序协议。它非常擅长通过网络传输文档,尤其是“网络规模”。
已经尝试使用Link 标头来触发其他缓存资源的失效,但据我所知,它们都没有通过提案阶段。
推荐阅读
- apache-spark - Apache Spark 重新分区/分桶最佳实践以避免数据倾斜
- javascript - Javascript文本颜色变化取决于背景
- java - JavaBeanExecutable HV000254 缺少 Java Enum 的参数元数据
- node.js - 无法从 inversify-express-utils 控制器全局捕获错误
- ios - 如何在 Xcode 中更改 UIButton 的背景图像的不透明度?
- python - 想检查输入 x(有 5 列)在 python 中是否有不同的输出 y
- java - 如何仅对 .on() 中的语句进行连接或将连接转换为等效的数据?
- html - 禁用单击按钮,直到打开的选项卡关闭
- android - 如何为 android 构建颤振应用程序?
- draw.io - draw.io - 对象自动调整距离