REST API子终结点的命名约定

REST API子终结点的命名约定,api,rest,naming-conventions,Api,Rest,Naming Conventions,让我们想象一下,我有几个相关的数据表(当然还有对象): 类父类{ 最终int id; } 班童{ 最终int id; 最终int-parentId; } 对于父CRUD操作,我将使用建议的命名约定: 获取/父级-检索所有父级 发布/父级-创建新父级 GET/parents/:id-检索具有unqique id的父项 PUT/parents/:id-使用unqique id更新父级 DELETE/parents/:id-删除具有unqique id的父项 使用相同的命名约定建议,我将使用以下

让我们想象一下,我有几个相关的数据表(当然还有对象):

类父类{
最终int id;
}
班童{
最终int id;
最终int-parentId;
}
对于父CRUD操作,我将使用建议的命名约定:

  • 获取/父级-检索所有父级
  • 发布/父级-创建新父级
  • GET/parents/:id-检索具有unqique id的父项
  • PUT/parents/:id-使用unqique id更新父级
  • DELETE/parents/:id-删除具有unqique id的父项
使用相同的命名约定建议,我将使用以下儿童请求:

  • GET/parents/3/children-获取id为1的父级的所有子级
  • POST/parents/3-为id为1的父级创建新子级
  • GET/parents/1/children/3-为id为1的父对象获取子对象3
  • 放置/parents/1/children/3-更新id为1的父级的子级3
  • 删除/parents/1/children/3-删除id为1的父级的子级3
Id
3
是子项的唯一(主键)
Id
,因此我不需要知道子项的获取、更新和删除请求中的父项
Id
,因为实际上我可以使用类似于以下内容的名称:

  • GET/children/3-获取子3(隐式地它属于父1)
  • PUT/children/3-更新子3(隐式地它属于父1)
  • DELETE/children/3-删除子3(隐式地它属于父1)
注意,这就是问题所在!我应该如何组织儿童CRUD请求的enpoint名称?我应该使用与上述相同的命名模式吗?或者我应该组合如下模式:

  • GET/parent/3/children-获取父级3的子级
  • 发布/父级/3/子级-为父级3创建子级
  • GET/children/3-获取id为3的子对象
  • PUT/children/3-使用id 3更新子项
  • DELETE/children/3-删除id为3的子项

    • REST不关心资源标识符的拼写;从通用组件的角度来看

      /parents/1/children/3
      /children/3
      /b7191775-b50b-4f35-815f-49070adbfc29
      
      都很好


      如果您预计需要经常从子上下文描述父资源的标识符,
      /parents/1/children/3
      可能很方便,因为您可以使用将子标识符转换为父标识符。

      3
      是不属于父
      1
      的子标识符时,我预计不会出现问题。将
      3
      作为子标识符从数据库中获取信息将适用于任何父标识符。至于我,这是错误的。为了解决这个问题,我需要在获取子信息之前检查子标识符是否属于父范围。但is使功能更加复杂,因为我需要执行过多的SQL查询来检查子项是否属于父项。因此,命名问题与这个问题有关。