【发布时间】:2020-08-18 04:57:26
【问题描述】:
我的数据模型是这样的:
User: id, email, hashed_password
Item: id, name, color
UserItem: user_id, item_id, rating
我想编写一个 RESTful API 来获取这些资源。身份验证是通过 OAuth 2 提供的,带有 JWT 令牌(包含记录的用户 ID)。
第一种方法
端点
URL 结构的第一个想法是(我在还没有身份验证时选择的那个):
/items/{item_id}
/users/{user_id}
/users/{user_id}/items/{item_id}
在这种情况下,ID 为 1 的用户可以使用:
-
GET /users/1获取自己的信息; -
GET /users/1/items获取自己的物品(有评分); -
GET /items获取他们可以添加到收藏中的所有项目。
分析
我认为这个解决方案很清晰,但也不优雅。
好:
- 您可以轻松获取其他用户信息(如果他们可用);
- 端点和数据模型之间的一对一关系。
不好:
- 较长的网址;
- 存在冗余(为什么
GET /users/1/items在令牌中已经有关于 id 1 的信息?)。
第二种方法
端点
鉴于您可以从令牌中提取用户 ID,因此结构也可以更简单:
/items/{item_id}
/users/{user_id}
在这种情况下,ID 为 1 的用户可以使用:
-
GET /users/me获取自己的信息; -
GET /items?class=owned获取自己的物品(带评分); -
GET /items?class=all获取他们可以添加到收藏中的所有项目。
分析
这个解决方案有点混乱,但可能更优雅。
好:
- 较短的网址;
- 减少冗余(
GET /items获取您自己的项目)。
不好:
- 仅表示模型 UserItem(即使在这种情况下,获得没有评级的项目可能几乎毫无意义,如果用户尚未添加它,则可以将其设置为 null);
- 获取其他用户的项目并不简单(可能类似于
GET /items?user=3?)。
结论
老实说,我不知道在这种情况下最佳做法是什么。我觉得这两个都有点不对劲。也许有一种我没有看到的混合方法?
你会如何组织这样的模型?
【问题讨论】:
标签: rest api restful-authentication