具有多种值类型的 REST API 参数
REST API parameter with multiple value types
我有 API 路由 /api/users/:user_id
,它以数字作为参数。
我现在想要相同的路线,但使用用户名而不是 id,如下所示:/api/users/:username
.
在我的代码中,我将路由设置为 /api/users/:user
并检查 user
URI 参数,如果它是数字或字符串则执行不同的操作。
使用相同的路由但使用不同的参数类型是否是一种好习惯/高效?用户名和用户 ID 都是唯一的。
它有效,我只是想知道这是否是一个实际的解决方案,或者我是否应该做单独的路线。
我们通过解析路径变量解决了这个问题。
伪代码
long id;
String name;
try{
id = parselong(input);
}catch(parse exception){
name = input;
}
findbynameorid(id,name)
select * from customer where name = ? or id = ?
在路由上共享路由参数并不是真的"good practice",但只要 ID 和用户名都是唯一的,就应该没问题。两者都充当用户的唯一标识符,因此都可用于在该路线中查找用户。
您可以接受 ID 和用户名作为同一个参数,方法是首先使路由参数更加宽松。接下来,您可以使用以下(伪)查询来查找该参数是否与 ID 或用户名匹配:
SELECT id, name FROM users WHERE id={param} OR username={param}
记得将该参数作为真正的查询参数传入;不要简单地连接字符串。这样做会使您面临 SQL 注入攻击。
假设 ID 和用户名都是唯一的,这是有效的解决方案。
关于实现,您可以使用正则表达式匹配用户标识符并检查它是ID还是用户名。
解决方案
将参数值设为字符串,并发送一个请求参数作为描述请求方式的附加标志。
/api/users/:user_key?type=boolean
> true
(默认)userid & false
用户名,反之亦然。
修改你的api然后可以回答两个不同的apis
/api/users/user/userid/:id
& /api/users/user/username/:name
推荐
以上可以解决您的问题。但不推荐使用 REST api 处理获取用户配置文件信息的方法。假设您将在其余应用程序中引入用户身份验证。
- Self api :
/api/users/me
: 这将获取当前登录的关于 session/token. 的用户信息
- 用户 api :
api/users/:id
: 这将获取特定用户信息
- 用户名api:
api/users?filters={username=some_username, }
:这将获取用户名与给定过滤器匹配的那些用户的信息。
我有 API 路由 /api/users/:user_id
,它以数字作为参数。
我现在想要相同的路线,但使用用户名而不是 id,如下所示:/api/users/:username
.
在我的代码中,我将路由设置为 /api/users/:user
并检查 user
URI 参数,如果它是数字或字符串则执行不同的操作。
使用相同的路由但使用不同的参数类型是否是一种好习惯/高效?用户名和用户 ID 都是唯一的。
它有效,我只是想知道这是否是一个实际的解决方案,或者我是否应该做单独的路线。
我们通过解析路径变量解决了这个问题。
伪代码
long id;
String name;
try{
id = parselong(input);
}catch(parse exception){
name = input;
}
findbynameorid(id,name)
select * from customer where name = ? or id = ?
在路由上共享路由参数并不是真的"good practice",但只要 ID 和用户名都是唯一的,就应该没问题。两者都充当用户的唯一标识符,因此都可用于在该路线中查找用户。
您可以接受 ID 和用户名作为同一个参数,方法是首先使路由参数更加宽松。接下来,您可以使用以下(伪)查询来查找该参数是否与 ID 或用户名匹配:
SELECT id, name FROM users WHERE id={param} OR username={param}
记得将该参数作为真正的查询参数传入;不要简单地连接字符串。这样做会使您面临 SQL 注入攻击。
假设 ID 和用户名都是唯一的,这是有效的解决方案。
关于实现,您可以使用正则表达式匹配用户标识符并检查它是ID还是用户名。
解决方案
将参数值设为字符串,并发送一个请求参数作为描述请求方式的附加标志。
/api/users/:user_key?type=boolean
>true
(默认)userid &false
用户名,反之亦然。修改你的api然后可以回答两个不同的apis
/api/users/user/userid/:id
&/api/users/user/username/:name
推荐
以上可以解决您的问题。但不推荐使用 REST api 处理获取用户配置文件信息的方法。假设您将在其余应用程序中引入用户身份验证。
- Self api :
/api/users/me
: 这将获取当前登录的关于 session/token. 的用户信息
- 用户 api :
api/users/:id
: 这将获取特定用户信息 - 用户名api:
api/users?filters={username=some_username, }
:这将获取用户名与给定过滤器匹配的那些用户的信息。