json - JSON 表示中的链接关系

标签 json rest hateoas rel

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

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

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

Sample Resource:

{
   "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 规定:

The context of the link is either a feed IRI or an entry ID, depending on where it appears

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

谢谢!

最佳答案

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

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

@rel - For identifying how the target URI relates to the 'Subject Resource'. The Subject Resource is the closest parent Resource element.

关于json - JSON 表示中的链接关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6993318/

相关文章:

javascript - 如何按按钮数据属性过滤 JSON 文件

javascript - ng-repeat 仅显示对象数组中的第一项

php - jQuery UI 自动完成 - 西类牙字符在本地正确显示但在服务器上不正确

c# - 如何对 Refit ApiResponse<T> 进行单元测试?

python - 如何使用Python将Json线转换为 Parquet ?

javascript - 路由匹配不明确

rest - 如何使用 BaseX RESTXQ 获取整个查询字符串?

jersey - 有没有办法将 JAX-RS 资源链接到 Spring HATEOAS 中的另一个资源?

web-services - 如何在 GUI 应用程序的 HATEOAS API 中处理全局超媒体?

http - HATEOAS Rel - 有任何标准吗?