设计REST API时多路径混乱

时间:2019-05-29 04:06:35

标签: node.js rest api swagger swagger-codegen

我们有一个名为游戏和玩家的资源

/games -> Get all Games available

/games/{game-id} -> Get the game details of specific Game with game-id

/players/me -> Get logged in Player details

会有玩家玩的游戏,可以在游戏或玩家下标记


场景1

/games/me -> Fetches games played by the current logged in player

这会将请求分组在“游戏”标签下。我正在使用Swagger API,因此此调用将转到客户端生成的代码上的GamesAPI控制器。我认为它应该出现在Games api中,而不是与游戏相关的玩家中。

问题:将“我”视为特殊的ID似乎太奇怪了,因为它看起来是我无法消化的{game-id}的一种形式。


场景2

/players/me/games -> Fetches games played by the current logged in player

此代码将其分组在Player标记下,该标记在代码生成后进入PlayerAPI。路径具有很好的含义,但是与将其包含在GamesAPI中更相关(根据我的选择-我可能错了,请提出建议)

在这两种情况中,哪个是设计此问题的更好方法?

3 个答案:

答案 0 :(得分:0)

场景1在两个场景中似乎更好一些,因为通常您的游戏网址将落入GameController,并且您可以在其中具有操作功能来获取所有游戏,具有给定ID的一个游戏或已登录用户的游戏。

答案 1 :(得分:0)

关系设计是由API设计架构的方式驱动的。因此,在您的情况下

1个玩家可以玩1个或很多游戏-因此, 1对多关系

因此,您应该根据玩家分组游戏数据。因此,有两种情况可以使API具有更好的性能

场景1

在“游戏”中搜索玩家ID并将其分组更容易吗?

场景2

根据游戏ID搜索玩家然后将其分组更容易吗?

从逻辑上讲,考虑场景1更有意义,因此

import re

for col in _ws.columns:
max_lenght = 0
print(col[0])
col_name = re.findall('\w\d', str(col[0]))
col_name = col_name[0]
col_name = re.findall('\w', str(col_name))[0]
print(col_name)
for cell in col:
    try:
        if len(str(cell.value)) > max_lenght:
            max_lenght = len(cell.value)
    except:
        pass
adjusted_width = (max_lenght+2)
_ws.column_dimensions[col_name].width = adjusted_width

答案 2 :(得分:0)

这就是我解决的方法。

如方案1所述,我看到“我”与{game-id}发生冲突,并使用户感到困惑。 在方案2中,我发现从播放器API获取用户游戏并不直观。

因此,我采用了一种尝试使端点最小化的方法。 我为GET / games添加了一个新的查询参数“ playedOnly:boolean”,该参数返回与玩家相关的所有游戏。

这简化了很多事情。我仍然可以使用/ games终结点,而不会感到困惑!