【问题标题】:How should I handle HATEOAS links and references in JSON? [closed]我应该如何处理 JSON 中的 HATEOAS 链接和引用? [关闭]
【发布时间】:2012-10-22 19:25:57
【问题描述】:

我正在设计一个 REST api 并尽可能地保持 RESTful。我想将HATEOAS 合并到 json 响应中。

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

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

"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 结构(除了再次适配 atom)来描述资源属性中的引用?(例如消息的发送者)。

    引用可能应该再次解析为 url,但是包含简单 id 会很糟糕吗?有点像:

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

我的想法是,虽然 HATEOAS 使客户不需要很多知识来使用 API,但我有点不愿意消除使用这些知识的可能性(比如通过在不首先查找用户的情况下构建链接客户端)。

【问题讨论】:

    标签: json rest hateoas


    【解决方案1】:

    我在 API-Craft google group 上重新启动了这个话题,并得到了一些很好的回应。

    Array设计的主要优点是:

    • 同一关系的多个链接
    • 同一链接的多个关系,无需重新编写链接
    • 能够对链接进行排序

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

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

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

    【讨论】:

    • 哈!看起来您在我撰写回复时回答了您自己的问题。感谢您的更新!
    • 当你说数组设计的优点之一是同一个关系的多个链接时,原问题中的上述数组是针对一个数组中的不同关系。那么这和你最初询问的风格是不是有点不同?
    • @ammianus - 通过将关系作为单个链接的属性,您可以将其值作为关系列表,如果关系是键而 url 是值,则这是不可能的。 href 也是如此。
    • HAL 简单易行,但使用 JSON-LD,您可以获得更多选择...
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为这样你就可以基于 http 方法提供多个链接。

      例如

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多