使用JSON资源构建RESTful / hypermedia API时,我似乎有两种选择来指定资源之间的超媒体关系。
将链接嵌入JSON文档的正文中。这里的问题是没有用于指定超链接的标准化语法,虽然我看到了许多努力:( HAL,Collection + JSON,JSON-LD,JSON Schema等等)。
使用HTTP链接标头。这是标准化的,因此这似乎比嵌入式链接更具优势。客户只需了解如何理解标准标题,即可实现超媒体的好处。
所以,特别是在处理JSON资源的上下文中,这是要走的路,为什么?
答案 0 :(得分:13)
使用超媒体JSON格式。虽然链接标题是标准的,但它们很难被采用。它们对于非超媒体的媒体格式更有效。但是既然你可以选择并且可以选择超媒体格式(不像PNG和JPG那样),你应该选择一个并继续前进。
所有的JSON标准都在冒泡,直到一个或另一个成为“事实上的”标准。他们使用的越多,他们就越“事实上”。
在我看来,HAL是一个坚实的标准轨道,我会选择它。
但无论如何,请使用超媒体格式,因为你可以。
答案 1 :(得分:10)
如果您希望HTTP中介处理您的链接,那么您一定要使用链接标题。其中一个例子是Linked Cache Invalidation:
http://tools.ietf.org/html/draft-nottingham-linked-cache-inv-01
如果您只想公开指向客户的链接,最好将它们放在实体中,以便利用嵌套元素中的链接:
{
'item': [
{ 'name': 'fork', 'href': 'http://example.com/item/1' },
{ 'name': 'spoon', 'href': 'http://example.com/item/2' },
{ 'name': 'spork', 'href': 'http://example.com/item/3' }
],
'href': 'http://example.com/items'
}
答案 2 :(得分:10)
如果需要,它们甚至可以包含一些JSON! http://tools.ietf.org/html/draft-nottingham-link-hint-00
这种方法允许在所有回复中同时传递:
当然,资源表示可能包含以各种形式编码的链接,但使用链接头可以提供站点动态结构中最重要的部分。
这个解决方案最终具有吸引力的是恕我直言,接受邮件"暗示。
答案 3 :(得分:5)
您无法压缩标头。如果你有很多链接。这可能会有所不同。
为链接提供上下文。链接头具有anchor属性,但没有标准化的片段路径语法,因此YMMV。
我无法想到任何其他利弊。
答案 4 :(得分:0)
在我看来,使用两种备选方案(响应主体中的链接头和超媒体链接遵循标准格式,如HAL)允许您的解决方案获得两种方法的好处。当然,如果您的REST开发框架支持在两个地方自动创建链接,那么这听起来不错。