我有API路由/api/users/:user_id
,它以数字作为参数。
我想现在拥有相同的路线,但是使用用户名而不是ID,如下所示:/api/users/:username
。
在我的代码中,我将路由设置为/api/users/:user
,并检查user
URI参数,如果是数字或字符串,则执行不同的操作。
使用相同的路线,但使用不同的参数类型是一种良好的做法/效率吗?用户名和用户ID都是唯一的。
它有效,我只想知道这是否是一个实用的解决方案,或者我是否应该分开路线。
答案 0 :(得分:1)
我们通过解析路径变量来解决它。
伪造的代码
long id;
String name;
try{
id = parselong(input);
}catch(parse exception){
name = input;
}
findbynameorid(id,name)
select * from customer where name = ? or id = ?
答案 1 :(得分:1)
假设ID和用户名都是唯一的,那么它就是有效的解决方案。
关于实现,您可以使用正则表达式来匹配用户标识符,并检查它是ID还是用户名。
答案 2 :(得分:0)
在路由上共享路由参数并不是真正的“好习惯”,但只要ID和用户名都是唯一的,您应该没问题。两者都充当用户的唯一标识符,因此两者都可用于在该路线中查找用户。
您可以通过首先使路由参数更加宽松来接受ID和用户名作为相同的参数。接下来,您可以使用以下(伪)查询来查找该参数是否与ID或用户名匹配:
SELECT id, name FROM users WHERE id={param} OR username={param}
请记住将该参数作为实际查询参数传递;不要简单地连接字符串。这样做会打开你的SQL注入攻击。
答案 3 :(得分:0)
最好使用单独的路由,如果你看到从代码中删除IF的可能性,那就去做吧!
例如
/ API /用户/ ID /:USER_ID
/ API /用户/用户/:USER_ID
答案 4 :(得分:0)
<强>解决方案强>
将参数值设为字符串,并将一个Request参数作为描述请求模式的附加标志发送。
/api/users/:user_key?type=boolean
&gt; true
(默认)userid&amp;用户名为false
,反之亦然。
修改你的api然后可以回答两个不同的apis
/api/users/user/userid/:id
&amp; /api/users/user/username/:name
<强>推荐强>
以上可以解决您的问题。但不建议使用REST api处理获取用户配置文件信息的方法。假设您将在休息应用程序中引入用户身份验证。
/api/users/me
:这将获取当前相对于该会话/令牌记录的用户信息。api/users/:id
:这将获取抓取特定用户信息api/users?filters={username=some_username, }
:这将获取具有与给定过滤器匹配的用户名的用户的信息。