REST API:端点名称冲突以及端点路径中的前缀/名称空间/逻辑作用域

REST API:端点名称冲突以及端点路径中的前缀/名称空间/逻辑作用域,rest,api-design,Rest,Api Design,通常,我以这种方式公开端点: /api/1/users /api/1/users/{uid} /api/1/groups /api/1/groups/{gid} /api/1/items /api/1/items/{iid} /api/1/groups/{gid}/users /api/1/users/{uid}/items 为了表示层次结构,我通常采用以下方式: /api/1/users /api/1/users/{uid} /api/1/groups /api/1/groups/{gid

通常,我以这种方式公开端点:

/api/1/users
/api/1/users/{uid}
/api/1/groups
/api/1/groups/{gid}
/api/1/items
/api/1/items/{iid}
/api/1/groups/{gid}/users
/api/1/users/{uid}/items
为了表示层次结构,我通常采用以下方式:

/api/1/users
/api/1/users/{uid}
/api/1/groups
/api/1/groups/{gid}
/api/1/items
/api/1/items/{iid}
/api/1/groups/{gid}/users
/api/1/users/{uid}/items
或获得类似的结果:

/api/1/users?group_id={gid}
/api/1/items?user_id={uid}
除非你面对这个问题,否则一切都会顺利进行:

/api/1/users
/api/1/groups   # groups of users
/api/1/items
/api/1/groups   # groups of items
在这里我可以想象两个选项:

  • 要更改端点名称,请执行以下操作:

    /api/1/users
    /api/1/groups
    /api/1/items
    /api/1/item_groups
    
  • 要通过添加某些前缀、命名空间或作用域来修改路径,请执行以下操作:

    /api/1/{users_prefix}/users
    /api/1/{users_prefix}/groups
    /api/1/{items_prefix}/items
    /api/1/{items_prefix}/groups
    
  • 我更喜欢前缀,因为它们使项目关系更为明显。
    另一方面,这种冲突非常罕见,前缀使路径更加复杂

    我还有疑问,因为/api/1/{items\u prefix}并不代表任何资源或集合。
    虽然/api也不这样做,并且通常使用/api/{version}启动path

    因此,我无法从REST原则或最佳实践的角度找出解决名称冲突的最佳方法是什么


    提前感谢。

    常见免责声明:REST不关心您的url结构,这里也没有标准原则。以下或多或少是一个建议/意见:

    我对你的问题的理解是:

  • 有3个主要概念、项目、用户和组
  • 您希望能够获取所有项目、所有组和所有用户的列表
  • 您希望能够查看每个组的项目和每个用户的项目
  • 基于此,我可能会选择如下结构:

    # users
    
    /user           - list of users
    /user/{id}      - one user
    /user/{id}/item - items belonging to 1 user
    
    # groups
    
    /group           - list of groups
    /group/{id}      - one group
    /group/{id}/item - items belonging to 1 group
    /group/{id}/user - users belonging to one group
    
    # items
    
    /item       - list of all items. If this is meaningless, just throw a
                  useful error that tells the developer why there is no root
                  collection for this.
    /item/{id}  - one item
    

    谢谢你的回复。我的想法是url结构没有规则。关于您的提案,我们混合了两种不同的实体——用户组和项目组。这是完全不同的事情。想象一下,在一个列表中有“管理员”和“食物”。此外,对于检索GET/group/{id}/item的[],我们有双重含义。它可能是对有效项目组的请求,其中没有项目,也可能是对用户组的请求,我们没有机会区分它们。如果您有两个不同的实体,并且您担心混淆,请将它们称为
    usergroup
    itemgroup
    。这是我在问题中描述的两个变体之一:1/api/1/用户组2/api/1/{user_prefix}/groups关于选择一个而不是另一个的推理呢?问题在于推理。)