Restful API:管理员和用户范围的最佳实践

Posted

技术标签:

【中文标题】Restful API:管理员和用户范围的最佳实践【英文标题】:Restful API: Best practice for admin and user scope 【发布时间】:2022-01-06 08:59:19 【问题描述】:

我正在构建一个 API,用户和管理员可以在其中与相同的数据进行交互,但有不同的需求。 如果用户具有“管理员”角色,他也可以访问管理面板。

例如,让我们看看我们有一个像 Badges 这样的资源。徽章只是您在应用中完成某些操作时的奖励。

GET http://localhost/api/v1/badges

经过身份验证的用户可以调用此端点,它会返回所有徽章的列表(无论是否有徽章)以及进度详细信息。

GET http://localhost/api/v1/badges?user_id=2

使用user_id 参数,我们可以看到其他用户的这些详细信息(如果他允许的话)。

但从管理员范围内,我只需要查看所有徽章的列表,没有成就详细信息(CRUD 操作)。

所以我有两个选择:

创建“管理员”端点:GET http://localhost/api/v1/admin/badges。 添加自定义标题“X-App-Scope”以识别我是管理员还是用户。

我不喜欢第二个,因为我认为我会在同一个端点有很多 if 语句和行为,具体取决于范围。

因为我有很多这样的用例,所以我想确保我的 API 架构能够很好地处理用户/管理员的需求。

你们有什么想法/例子来管理这样的事情吗?

谢谢!

【问题讨论】:

如果你有 X-App-Scope 为什么在 url 中有相同的信息? 这是 2 个不同的想法:url 中的“admin”表示列出徽章的第二个端点,而 X-App-Scope 可用于同一端点 (/v1/badges) 以区分我是否想要简单的徽章列表或包含用户成就详细信息的列表 这是一个公共 API 吗?用户很可能需要经过身份验证才能访问端点,检查经过身份验证的用户是否是管理员,提供不同的结果 我不能这样做,因为用户也可以是管理员,并且在这两种情况下都使用此端点。 对没有成就的版本使用http://localhost/api/v1/badges/simple 【参考方案1】:

TL;DR:REST 的设计是为了让您在这里使用两个不同的resources。

核心问题是:通用组件,比如浏览器,如何知道你的特殊资源需要添加这个自定义标头?

特别是考虑我向您发送此资源的 URL 副本的情况,仅此而已。您如何知道将客户标头添加到请求中?

另一方面,如果您使用不同的资源与每个受众共享此信息,那么一切都可以正常工作

【讨论】:

【参考方案2】:

我发现保持尽可能简单/清晰的唯一方法是为每个用例创建多个端点:

GET http://localhost/api/v1/badges 获取原始数据中的所有徽章

GET http://localhost/api/v1/users/badges 以转换格式获取所有带有用户统计信息(进度、成就...)的徽章

GET http://localhost/api/v1/users/uuid/badges 以转换格式为指定用户获取所有带有用户统计信息(进度、成就...)的徽章(如果他的个人资料是公开的)

现在我有很多/users/XYZ 端点,但我的代码似乎更易于阅读和维护,而且我真的不需要看代码来猜测将返回什么数据、条件等...

我一直想知道当你有一个管理部分时其他 API 是如何编写的,因为到处都有 /users 并不是真的“漂亮”,而且我在其他任何地方都看不到。

【讨论】:

以上是关于Restful API:管理员和用户范围的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

RESTful API 设计更新 1/多对多关系的最佳实践?

RESTful API 最佳实践

RESTFul API最佳实践

RESTful API 最佳实践(转)

Restful Api 最佳实践

10个有关RESTful API良好设计的最佳实践