HAL关系类型(rel)与链接名称属性

问题描述 投票:2回答:2

我试图理解使用关系类型和链接与Name属性之间的细微差别。

也许一个例子最能说明我的问题。考虑一个代表同行评审文章的HAL格式化响应:

  {
    name: "Mechanics (Le mecaniche)",
    _links : {
      canonical : { href: "https://phys.org/articles/Mechanics"},
      "x:author" : [
         { href : "https://phys.org/authors/111", title : "Galileo Galilei"}
      ],
      "x:reviewer" : [
         { href : "https://phys.org/authors/222", title : "Isaac Newton"}
      ]
    }
  }

我试图用这个例子展示的关键是文章资源包含与同一类型资源的多个语义上不同的关系。在此示例中,文章具有指向作者的链接,作者是文章的作者,以及指向对文章进行同行评审的作者的链接。

在上面的例子中,我将它们定义为两种不同的关系类型。基于我对HAL specWeb Linking spec的解读,上述方法既有效又与许多例子一致。

但是......如果我将相同的响应格式化如下:

  {
    name: "Mechanics (Le mecaniche)",
    _links : {
      canonical : { href: "https://phys.org/articles/Mechanics"},
      "x:author" : [
         { name = "author", href : "https://phys.org/authors/111", title : "Galileo Galilei"},
         { name = "reviewer", href : "https://phys.org/authors/222", title : "Isaac Newton"}
      ]
    }
  }

在这个例子中,我选择使用Relation Type来指示资源类型并延迟到Link的Name属性来缩小关系含义。

我发现后一种方法从务实的角度来看是有吸引力的。我可以想象使用Relation Type作为资源缓存的关键字的客户端应用程序的作者。在这种情况下,客户端将具有单个作者资源缓存,而不是具有重复条目的独立作者和审阅者缓存(其中作者也是审阅者。)我意识到单个异构资源缓存将消除此和/或推送缓存对浏览器负责(应该是恕我直言),但是......再次,这是务实的观点。许多Web应用程序在内部处理缓存,并且需要每种资源类型的缓存(可能按资源类型应用不同的策略。)

我也喜欢后一种方法,因为根据HAL spec,我可以利用链接的名称属性“作为选择共享相同关系类型的链接对象的辅助键”。我不得不将规范中的那一行读作“......相同的资源类型”。

最后但同样重要的是,我想知道这两种方法如何影响这些链接的文档。具体来说,作为“扩展关系类型”,'x:author'和'x:reviewer'关系类型应该在其url(直接或通过CURIE)提供文档。如果我遵循后一种方法,使用链接名称属性,那么文档需要描述资源关系的命名变体的子部分。

我做了一些搜索,我没有找到任何使用链接名称属性的例子。我很乐意看到一些,和/或听取作者关于该领域意图的更多信息。


更新..

到目前为止,响应强调关系类型旨在反映上下文与href结果之间的关系,而不是该目标的资源类型。

这是可以理解的,但如果可能的话,请详细说明Link的Name属性的用途。它的使用示例是什么,将它与关系类型区分开来?

rest hateoas discoverability
2个回答
1
投票

只要不将语义附加到名称,就可以执行第二步。不幸的是x:author似乎在第二种情况下会产生误导,因为我们通常不认为审稿人是作者。

您可以通过使用两个链接关系类型然后在返回的表示中使用元数据来通知客户端这两个表示是相同的类型,从而实现您原始声明的目标“与同一类型的资源包含多个语义上不同的关系”。我不确定是否有一种干净的方法可以将目标类型嵌入到上下文文档中。这通常不是一种非常友好的HTTP方式。


1
投票

即使你认为这两个人是“作者”,他们与主要资源的关系也不是“作者”。

链接关系类型不应描述“链接资源是什么类型的资源”,而是“链接资源与上下文资源的关系”。

© www.soinside.com 2019 - 2024. All rights reserved.