V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
airycanon
V2EX  ›  API

请教一个 RESTful API 的设计问题

  •  
  •   airycanon · 2017-10-23 11:30:00 +08:00 · 2001 次点击
    这是一个创建于 2348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有如下两个表

    • 用户 users ( id,group_id,...)

    • 组 groups ( id,...)

    想要设计一个 API 把用户批量加入某个组,请问下面哪个 API 更好一些,或者有更好的方案?先谢过各位。

    • POST /users/add-to-group/{组 id}

      提交用户 id 数组

    • POST /groups/{组 id}/add-users

      提交用户 id 数组

    9 条回复    2017-10-23 11:57:03 +08:00
    Sanko
        1
    Sanko  
       2017-10-23 11:33:08 +08:00 via Android
    直觉第一个吧
    whypool
        2
    whypool  
       2017-10-23 11:38:09 +08:00
    第一种;
    不过一般会把动作提到前面:post /groups/add-users/{id}
    pubby
        3
    pubby  
       2017-10-23 11:41:34 +08:00
    为啥不是 POST /groups/<gid>/users
    airycanon
        4
    airycanon  
    OP
       2017-10-23 11:42:41 +08:00
    @pubby 这不就是第二种么……
    pubby
        5
    pubby  
       2017-10-23 11:45:41 +08:00 via Android
    url 应该是资源,不是动作
    mcfog
        6
    mcfog  
       2017-10-23 11:46:15 +08:00
    这两个都是典型的 restful 反模式(动作写在 URL 里用 POST )

    user 和 group 的关系如果作为 group 资源的属性的话

    PATCH /group/<group_id>/users
    [...user_ids]
    或者(便于扩展批量删除等其他语义)
    {type: join, users: [...user_ids]}

    也可以把关系当作独立的资源
    POST /user-group-relation
    [...{user_id, group_id}]
    airycanon
        7
    airycanon  
    OP
       2017-10-23 11:49:06 +08:00
    @pubby @mcfog 两位说的意思我明白了,多谢指点。
    mec
        8
    mec  
       2017-10-23 11:51:28 +08:00
    楼上正解,restful uri 里面是资源,不能有动词
    动词用 http 里面的 method 区分,如果想丰富动作,可以添加参数 method 来区分
    TuringGunner
        9
    TuringGunner  
       2017-10-23 11:57:03 +08:00
    你这两个都不对

    要么重新重新抽象出来一个新的资源,就像楼上那样

    或者写一个 users controller,处理 users 这个资源,看你这个应该是在 users 里增加 group_id 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1133 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:55 · PVG 06:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.