具有多种值类型的 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还是用户名。

解决方案

  1. 将参数值设为字符串,并发送一个请求参数作为描述请求方式的附加标志。

    /api/users/:user_key?type=boolean > true(默认)userid & false 用户名,反之亦然。

  2. 修改你的api然后可以回答两个不同的apis

    /api/users/user/userid/:id & /api/users/user/username/:name

推荐

以上可以解决您的问题。但不推荐使用 REST api 处理获取用户配置文件信息的方法。假设您将在其余应用程序中引入用户身份验证。

  1. Self api : /api/users/me : 这将获取当前登录的关于 session/token.
  2. 的用户信息
  3. 用户 api : api/users/:id : 这将获取特定用户信息
  4. 用户名api:api/users?filters={username=some_username, }:这将获取用户名与给定过滤器匹配的那些用户的信息。