我该如何处理JSON中的HATEOAS链接和引用?

时间:2012-10-22 19:25:58

标签: json rest hateoas

我正在设计一个REST api,并且像它一样成为RESTful。我想将HATEOAS合并到json响应中。

将URL添加到相关资源很容易,但是对于用于这些链接的结构进行了一些讨论。

我发现很多文章都使用了从ATOM Feed中借用的结构:

"links": [ 
    {"rel": "self", "href":"http://example.org/entity/1"},
    {"rel": "friends", "href":"http://example.org/entity/1/friends"}, ... 
]

这提出了一些问题:

  • 为什么要将数组用作容器?根据我所知道的javascript开发人员,使用链接作为对象属性可以更轻松地访问链接。例如:

    "self":    { "href":"http://example.org/entity/1" }, /* (facebook uses this) */  
    "friends": { "href":"http://example.org/entity/1/friends", "type": "..."}
    
  • 是否有一个共同的json结构(再次调整原子旁边)来描述资源属性中的引用?(例如消息的发送者)。

    引用应该可以再次作为URL解析,但是包含简单id也不好吗?有点像:

    "sender": { 
        "id": 12345,
        "href": "resource-uri"
    }
    

我的想法是,虽然HATEOAS使得客户端不需要很多知识来使用API​​,但我不愿意消除使用该知识的可能性(比如访问个人资料图片)构建链接客户端而不首先查找用户。)

3 个答案:

答案 0 :(得分:26)

我在API-Craft google小组上重新启动了这个主题并得到了一些很好的回复。

Array设计的主要优点是:

  • 同一关系的多个链接
  • 同一链接的多个关系,无需编写链接aggain
  • 订购链接的能力

原因地图具有更好的可访问性。

就结构而言,有很多可能性:

我想我会选择HAL,因为它是最干净的解决方案,其余的看起来都很...... json很奇怪。

答案 1 :(得分:4)

就结构而言,您可以尝试查看HAL(http://stateless.co/hal_specification.html)或JSON-LD :( http://json-ld.org/

答案 2 :(得分:1)

我认为它可以提供基于http方法的多个链接。

e.g。

"links": [ 
    {"rel": "sender", "method":"post", "href":"http://example.org/entity/1"},
    {"rel": "sender", "method":"put", "href":"http://example.org/entity/1"}, ... 
]

也许你可以适应你的想法

"sender": { 
     "href":"http://example.org/entity/1",
     "methods": ["put","post"]
}