在 REST API 中使用另一个资源的 ID 命名获取资源



我正在定义一个REST API,并且不确定是否命名端点。

我已经有了以下方法

GET /users/{user_id}

这将返回以下内容:

{
    "user_id": "some id",
    "username": "some username (1:1 with user_id)",
    ...
}

我想要一个端点通过username检索资源,我不确定它是否应该是

GET /users/username/{username}

或者更确切地说

GET /usernames/{username}/user

还是别的什么?

通常一个资源由一个标识符唯一标识。在您的情况下,这将是user_id。因此,如果user_id是系统中唯一标识用户的,那么您的GET /users/{user_id} RESTful路由就非常合理。

另一方面,如果你想通过一些其他标准(比如username)搜索用户,你可以只使用查询字符串参数:

GET /users?username=foo_bar

它显然会返回一个用户名符合此条件的用户数组,如果在您的情况下用户名是唯一的,则该数组将始终最多包含一个元素:

[
    {
        "user_id": 123,
        "username": "foo_bar"
    }
]

另一方面,如果您决定user_id是系统中user资源的某个内部系统标识符(例如,它可能是SQL数据库中的主键),并且您希望在RESTful外观中向用户公开一些更友好的唯一id,那么您可以考虑使用GET /users/{username}。当然,在这种情况下,你应该很好地定义什么是username,以及它允许的字符是什么,因为如果你在用户名中允许一些特殊字符,事情可能会很快变成噩梦。这里有一个关于这个主题的good read,我强烈鼓励您仔细阅读并非常清楚地了解URL的路径段中允许的字符是什么。

我只想添加一个查询参数

GET /users?username=john

按用户名检索用户并不真正适合REST方案,所以我会选择已经提出的解决方案/users?name=....或[可能更全面]/users/<username>。只有当用户名不需要进行URI编码(在最好的情况下,不包含字母数字和下划线以外的字符)时,我才会使用后者

最新更新