首页 > 解决方案 > 带有身份验证的 RESTful API URL 设计

问题描述

我的数据模型是这样的:

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 的用户可以使用:

分析

我认为这个解决方案很清楚,但也不优雅。

好的:

坏的:

第二种方法

端点

鉴于您可以从令牌中提取用户 ID,结构也可以更简单:

/items/{item_id}
/users/{user_id}

在这种情况下,ID 为 1 的用户可以使用:

分析

这个解决方案有点混乱,但可能更优雅。

好的:

坏的:

结论

老实说,我不知道在这种情况下最好的做法是什么。我觉得这两个都有点不对劲。也许有一种我没有看到的混合方法?

您将如何组织这样的模型?

标签: restapirestful-authentication

解决方案


您可以查看 HAL 之类的格式。HAL 为您提供了一种描述特定资源(项目)的方法,并允许您创建指向这些资源的多个集合。

这意味着单个项目可以托管在/items/xyz,但项目可以同时是/user/a/items/items集合的一部分。

我在一个超媒体客户端上做了很多工作:https ://github.com/badgateway/ketting 。虽然这不仅仅是一个广告,还有其他选择,但我们可能会非常适合您的 API 设计方法。

但无论您使用哪种客户端,这样的系统都可以避免通过多个端点检索相同项目的问题。单个项目具有规范的 url,如果系统设计良好,您只需检索一次项目。

集合只是指向属于该集合的资源(项目)的链接列表。它们指向项目,但不“包含”,就像常规超链接一样。


推荐阅读