49

我正在设计一个基于 JSON 表示的 RESTful API。为了遵守 HATEOAS,我广泛使用资源之间的链接。因此,我遵循了这个建议,以与 ATOM 链接非常相​​似的方式对链接进行序列化。

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

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

样本资源:

{
   "blogpost":{
      "link":{
         "rel":"self",
         "href":"http://blog/post/4711"
      },
      "author":{
         "name":"Bob",
         "link":{
            "rel":"???",
            "href":"http://author/uri"
         }
      },
      "title":"foobar",
      "content":"A long article here…",
      "comments":[
         {
            "comment":"great article",
            "link":{
               "rel":"???",
               "href":"http://blog/post/4711/comment/1"
            },
            "author":{
               "name":"John Doe",
               "link":{
                  "rel":"???",
                  "href":"http://author/uri"
               }
            }
         }
      ],
      "tags":[
         {
            "value":"foo",
            "link":{
               "rel":"???",
               "href":"http://blog/post/4711/tag/foo"
            }
         }
      ]
   }
}

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

RFC 5988 指出:

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

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

谢谢!

4

3 回答 3

13

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

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

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

于 2011-08-09T20:05:54.177 回答
8

LSON-LD

你也许可以看看JSON-LD (JavaScript Object Notation for Linked Data。它看起来比HAL更复杂,但你可以用它做更多的事情。

JSON-LD 正在 W3C 内部进行标准化,这是提案建议

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

于 2013-12-10T11:18:12.220 回答
-7

回答这个问题有点晚了,但为了将来参考,这就是我解决这个问题的方法:

{
   "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"
      }
   }
}

当您考虑它时,评论,标签等都是链接到您的帖子的不同资源......为什么不把它们全部变成它们......链接!您甚至可以节省回复的大小;)

于 2013-09-21T21:26:26.533 回答