Java URI中的REST父id

Java URI中的REST父id,java,rest,uri,Java,Rest,Uri,假设我的模型由一个父实体组成,该实体通过子属性引用一些子实体。根据REST原则,特定子对象的URI的路径段将是/parent/{parentId}/children/{childId} 在对子对象执行更新操作时,通常只需子对象ID,即可唯一标识正确的子对象,并将路径中的父对象ID段视为冗余。这种冗余随着层次结构变得复杂而加剧 现在我想起来了,它也可能导致意外行为:如果程序员不知道,使用相同的childId但不同的parentId访问URI可能会导致相同的行为。当访问不相关的父项下的子项时,可能会

假设我的模型由一个
实体组成,该实体通过
属性引用一些
实体。根据REST原则,特定
子对象的URI的路径段将是
/parent/{parentId}/children/{childId}

在对
子对象执行更新操作时,通常只需
子对象ID
,即可唯一标识正确的
子对象
,并将路径中的
父对象ID
段视为冗余。这种冗余随着层次结构变得复杂而加剧

现在我想起来了,它也可能导致意外行为:如果程序员不知道,使用相同的
childId
但不同的
parentId
访问URI可能会导致相同的行为。当访问不相关的
父项下的
子项
时,可能会发生的情况是应返回客户端错误代码

目前,我认为可能不应该在REST API中引入层次结构,除非它是绝对直观的,因为它:

  • 使URI(从而使API)更加复杂。强化可维护性
  • 冗余可能会导致用户对访问某些URI的结果进行推理
  • 冗余可能会成为不知情程序员的陷阱

  • 有没有办法避免这种冗余,并且仍然遵循REST原则?

    是的,就这样构造URL吧

    /children/{childId}

    由于可以从服务器端的子级推断父级,因此没有理由在URL中声明它。只有在绝对需要时,才应该在URL中放置多个资源。例如,用户对评论进行投票。因为在数据库端没有正式的方法来确定,所以您可以创建一个url,如


    /voter/{userId}/comment/{commentId}/upvote

    因为REST是指资源,所以它们不一定是分层的

    在类似的API中,我有节、类别和文章。当然,每一个都在另一个之下,但在REST中,我将它们指定为section/{id}&article/{id}。它们仍然是指向单个资源的链接,但由于它们可以独立于其父资源,因此在URI中指定层次结构并不重要

    如果您确实想在URI中指定层次结构,那么应该检查以确保父级是子级的父级,并在其他情况下抛出错误,以保持层次结构的完整性

    TL;博士

    • /父/{parentID}
    • /child/{childID}

    对于我来说,这个问题的答案将由数据建模驱动,对于数据建模,问题是“是否为子模型使用复合键”,如果他使用复合键,那么你必须将父id放在URI中,如果不是,子id有自己的非复合id,那么你只能使用带有子id的URL


    这就是数据建模问题

    REST是一套原则,而不是标准。URI的“结果”是什么?(使用任何类型API的人都希望能够预测操作的结果,至少是基本的结果。)@DonalFellows-访问URI的结果。我为你编辑了这个问题:)。问题是这种API不够可预测。@giole-你当然是对的。编辑问题。REST对URI的结构没有任何意见,所以您试图遵从一些不存在的东西。检查论文。这个“RESTfulURL”的概念是框架编写者虚构出来的,假装他们在帮助人们做REST。所以你的意思是我的观察是正确的,对吗?您是否可以添加任何参考链接?谢谢。是的,你观察到的url结构是多余的是正确的。但老实说,我不知道有什么好的推荐信。如果其他人找到一篇好文章/参考资料,详细解释或引用规范/等,那么就投票/接受他们的答案。看起来Dave和你说的有些相同,所以我会问你同样的问题:那么,我的观察正确吗?您是否可以添加任何参考链接?谢谢。这有点多余,我认为你找不到真正的参考链接。休息毕竟是一种方法论。这样想:OOP。你有对象。有时他们只与父母相关,而有时他们自己相关。后者是你会在我给出的结构中反映出来的。