具有多个值类型的REST API参数

时间:2017-09-21 08:19:56

标签: rest api-design

我有API路由/api/users/:user_id,它以数字作为参数。

我想现在拥有相同的路线,但是使用用户名而不是ID,如下所示:/api/users/:username

在我的代码中,我将路由设置为/api/users/:user,并检查user URI参数,如果是数字或字符串,则执行不同的操作。

使用相同的路线,但使用不同的参数类型是一种良好的做法/效率吗?用户名和用户ID都是唯一的。

它有效,我只想知道这是否是一个实用的解决方案,或者我是否应该分开路线。

5 个答案:

答案 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)

<强>解决方案

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

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

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

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

  3. <强>推荐

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

    1. Self api:/api/users/me:这将获取当前相对于该会话/令牌记录的用户信息。
    2. 用户api:api/users/:id:这将获取抓取特定用户信息
    3. 用户名api:api/users?filters={username=some_username, }:这将获取具有与给定过滤器匹配的用户名的用户的信息。