使用其他资源获取资源';RESTAPI中的s id命名

使用其他资源获取资源';RESTAPI中的s id命名,rest,Rest,我正在定义RESTAPI,但不确定是否要命名端点 我已经有了下面的方法 GET /users/{user_id} 这将返回以下内容: { "user_id": "some id", "username": "some username (1:1 with user_id)", ... } 我想要一个端点通过用户名检索资源,但我不确定是否应该这样做 GET /users/username/{username} 或者更确切地说 GET /usernames/{usern

我正在定义RESTAPI,但不确定是否要命名端点

我已经有了下面的方法

GET /users/{user_id}
这将返回以下内容:

{
    "user_id": "some id",
    "username": "some username (1:1 with user_id)",
    ...
}
我想要一个端点通过
用户名
检索资源,但我不确定是否应该这样做

GET /users/username/{username}
或者更确切地说

GET /usernames/{username}/user

或者别的什么?

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

另一方面,如果希望通过其他条件(如
用户名
)搜索用户,则可以使用查询字符串参数:

GET /users?username=foo_bar
这显然将返回用户名符合此条件的用户数组,如果在您的情况下用户名是唯一的,则此数组将始终最多包含一个元素:

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

另一方面,如果您决定<代码> USER ID 是系统中的<代码>用户< /代码>资源的内部系统标识符(例如,它可以是SQL数据库中的主键),并且您希望在您的REST外观中公开一些更友好的唯一ID给用户,那么您可以考虑使用<代码> GET/用户/{username}。当然,在这种情况下,你应该很好地定义什么是

用户名以及允许的字符是什么,因为如果在用户名中允许一些特殊字符,事情很快就会变成一场噩梦。下面是关于这个主题的一个例子,我非常强烈地鼓励你仔细阅读,并且非常清楚什么是URL的路径段中允许的字符。

我只需添加一个查询参数

GET /users?username=john

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