2015-12-12 155 views
1

我正在定义一个REST API,并且不确定是否命名了一个端点。在REST API中使用另一个资源的ID命名获取资源

我有以下方法已经

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 

还是别的什么?

回答

1

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

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

GET /users?username=foo_bar 

这显然会回报用户,其用户名匹配的数组这一标准,如果你的情况的用户名是唯一这个数组总是包含最多一个元素:

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

在另一方面,如果你决定user_id是对0123的一些内部系统标识符资源(例如,它可能是SQL数据库中的主键),并且希望在用户的RESTful外观中显示一些友好的唯一ID,那么您可以考虑使用GET /users/{username}。当然在这种情况下,你应该很好地定义username是什么以及它允许​​的字符是什么,因为如果允许用户名中包含一些特殊字符,事情很快就会变成噩梦。以下是关于此主题的good read,我强烈建议您仔细阅读并非常理解URL的路径段中允许使用的字符。

0

我只是添加查询放慢参数

GET /users?username=john 
0

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