使用REST API中的其他资源的id命名获取资源

时间:2015-12-12 20:26:39

标签: rest

我正在定义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

或其他什么?

3 个答案:

答案 0 :(得分:1)

通常,资源由一个标识符唯一标识。在你的情况下,这将是user_id。因此,如果GET /users/{user_id}是唯一标识系统中用户的内容,则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,我非常强烈建议您仔细了解网址路径段中允许的字符数。

答案 1 :(得分:0)

我只是添加一个查询参数

GET /users?username=john

答案 2 :(得分:0)

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