我有一个像这样的简单资源:
/ API / {构造} /参展商/ {ID}
这通常是一个公共API,具体取决于URL配置部分的设置。
它可能会将此返回给未经过身份验证的用户:
{ "a" : "some value", "b" : "other value" }
但是如果管理员已登录并希望获得此资源,那么他们希望在同一资源上有一些略有不同的数据:
{ "a" : "some value", "C" : "admin only value" }
我是否应该检测此管理员权限并返回同一网址中的不同内容?
或者我应该有一个新的网址来识别它的用途并且内容可能不同?
/ API /管理/ {构造} /参展商/ {ID}
我的想法是,我不喜欢额外的网址,但如果我不根据用户改变内容,我会更容易地缓存公开内容。
管理员调用没有理由无法获得资源的完整公共版本以及其他仅限admin的字段,但在我的示例中他们可能实际上并不需要字段“b”,所以我宁愿管理员代表更轻一点。
答案 0 :(得分:2)
根据具体情况,这两种选择都是可行的。正如您所提到的,允许表示形式的变化会使缓存变得困难。但是,支持不同的资源会产生额外的开销。理想情况下,您的服务器端框架可以轻松创建其他资源,因此开销应该很小。
另一个选项是返回公共版本,并提供一个嵌入式超链接,该超链接指向仅包含其他“admin-only”属性的资源。如果您的客户可以轻松处理超媒体,那么这将成为一个相当灵活的选择。
答案 1 :(得分:1)
我认为经过身份验证的用户将是提供用户ID和密码的用户,即已登录。用户登录后,大多数REST应用程序倾向于依赖cookie来确定请求是否来自经过身份验证的用户或不。
理想情况下,每个用户都应该拥有自己的上下文。一个用户的/ tmp / foo与另一个用户的/ tmp / foo不同。您仍然可以拥有以/ public或类似名称开头的网址标识的公开内容。
出于安全原因,您实际上不希望将用户的ID泄露为URL的一部分。此外,用户ID通常是用户的电子邮件或帐号。
管理员是一种特殊情况,根据后端架构,可以实施一个允许管理员访问其他用户管理信息的解决方案。