JSON表示中的链接关系

JSON表示中的链接关系,json,rest,hateoas,rel,Json,Rest,Hateoas,Rel,我正在设计一个基于JSON表示的RESTful API。为了遵守HATEOAS,我广泛使用资源之间的链接。因此,我遵循了类似于ATOM链接的方式序列化链接 现在,我有时在识别正确的链接关系类型时遇到问题。当资源包含指向自身的链接时,self关系是显而易见的。当资源是子资源的集合和聚合,或者包含许多到相关资源的链接时,它会变得更加复杂 以一篇博客文章为例,考虑一个返回该博客文章快照的资源,包括作者、标签和评论。 显然,此资源包含许多子资源,当然还应提供指向这些子资源的单独链接: 那么,给定链接的

我正在设计一个基于JSON表示的RESTful API。为了遵守HATEOAS,我广泛使用资源之间的链接。因此,我遵循了类似于ATOM链接的方式序列化链接

现在,我有时在识别正确的链接关系类型时遇到问题。当资源包含指向自身的链接时,
self
关系是显而易见的。当资源是子资源的集合和聚合,或者包含许多到相关资源的链接时,它会变得更加复杂

以一篇博客文章为例,考虑一个返回该博客文章快照的资源,包括作者、标签和评论。 显然,此资源包含许多子资源,当然还应提供指向这些子资源的单独链接:

那么,给定链接的适当关系是什么?我知道有一些关系类型,如
标记
,但并非我所有的资源都与现有的关系类型匹配。或者在引用author/tag/comment时可以使用
self
,因为它与封闭的JSON(子)对象的上下文相关?语义实体
self
指的是什么

RFC 5988规定:

链接的上下文是提要IRI或条目ID,具体取决于它出现的位置

我如何用JSON来解释这一点?每个新对象都是新的上下文吗


谢谢

这是一个很好的问题。如果查看示例,您将看到REL是在子资源的上下文中定义的。
我不知道关于rel何时与整个资源或包含的子资源相关的任何明确指南。
我可以向您指出的唯一额外信息是RFC5988中的锚参数,它允许您使用片段或全新的URI重新定义上下文IRI

理想情况下,mediatype应该说明嵌套资源的上下文IRI是否不同,或者是否需要显式更改上下文IRI。这将是使用application/vnd.hal+json这样的媒体类型的另一个优势,而不是像hal规范中所说的那样使用普通的老application/json:

@rel-用于标识目标URI与“主题”的关系 资源'。主题资源是最近的父资源 元素


现在回答这个问题有点晚了,但为了将来参考,我是这样解决这个问题的:

{
   "blogpost":{
      "title":"foobar",
      "content":"A long article here…",
      "link":{
         "rel":"self",
         "href":"http://blog/post/4711"
      },
      "link":{
         "rel": "author",
         "href": "http://author/uri",
         "alt":"Bob"
      },
      "link":{
        "rel": "comment",
        "alt": "great article",
        "href":"http://blog/post/4711/comment/1"
      },
      "link": {
        "rel":"tag",
        "href":"http://blog/post/4711/tag/foo",
        "alt":"foo"
      }
   }
}
仔细想想,评论、标签等都是链接到你的帖子的独特资源。。。那为什么不让他们都变成现在的样子呢。。链接!您甚至可以节省响应的大小;)

LSON-LD 你可以看一看(JavaScript)的对象表示法。它看起来比它复杂,但你可以用它做更多的事情

JSON-LD正在W3C内部标准化

  • (由JSON-LD的创建者Manu Sporny回答)
  • JSON-LD
  • ()

对不起,我没有时间提供一个例子。

哇!你有重复的密钥!大多数JSON解析器只会忽略重复的键,只留下一个链接。考虑把你的链接放在一个数组中。这是API设计的一个很坏的例子。其他读者,请不要复制这个!请不要使用这个A。接近。
{
   "blogpost":{
      "title":"foobar",
      "content":"A long article here…",
      "link":{
         "rel":"self",
         "href":"http://blog/post/4711"
      },
      "link":{
         "rel": "author",
         "href": "http://author/uri",
         "alt":"Bob"
      },
      "link":{
        "rel": "comment",
        "alt": "great article",
        "href":"http://blog/post/4711/comment/1"
      },
      "link": {
        "rel":"tag",
        "href":"http://blog/post/4711/tag/foo",
        "alt":"foo"
      }
   }
}