【问题标题】:Link headers vs link elements for RESTful JSONRESTful JSON 的链接标头与链接元素
【发布时间】:2012-04-02 07:09:06
【问题描述】:

在使用 JSON 资源构建 RESTful / 超媒体 API 时,我似乎有两种选择来指定资源之间的超媒体关系。

  1. 在 JSON 文档的正文中嵌入链接。这里的问题是没有用于指定超链接的标准化语法,尽管我看到了一些很好的努力:(HAL、Collection+JSON、JSON-LD、JSON Schema 等等)。

    李>
  2. 使用 HTTP 链接标头。这是一个标准化的,所以这似乎比嵌入式链接更有优势。客户只需了解如何理解标准标头,瞧,超媒体的优点就实现了。

那么,特别是在处理 JSON 资源的上下文中,这是要走的路,为什么?

【问题讨论】:

    标签: json web-services http rest http-headers


    【解决方案1】:

    使用超媒体 JSON 格式。虽然链接头是标准的,但它们的采用率很低。它们对于非超媒体的媒体格式确实更有效。但既然您可以选择并且可以选择一种超媒体格式(例如,PNG 和 JPG 不同),您应该简单地选择一种并继续前进。

    所有 JSON 标准都在冒泡,直到其中一个或另一个成为“事实上的”标准。它们被使用得越多,得到的“事实上”就越多。

    在我看来,HAL 走上了坚实的标准轨道,我会选择它。

    但无论哪种方式,都可以使用超媒体格式。

    【讨论】:

    • 谢谢!在竞争标准中,HAL 似乎最适合我的应用程序和个人口味,虽然我很想简化一些事情并使用我自己的应用程序特定的超媒体格式,它类似于 HAL,但失去了一些要求。
    • 哦,不要那样做。如果每个人都随波逐流,标准的意义何在?相反,我会尝试在其中工作,并向从事它的人提出您的问题。这就是标准变得更好的方式。
    • JSON (Hyper-)Schema 更加灵活。它可以做的一件我在其他地方没有看到的事情是指定“表单”——也就是说,链接定义可以为要作为请求的一部分提交的数据的形状/结构指定 JSON 模式。
    【解决方案2】:

    如果您希望您的链接由 HTTP 中介处理,那么您绝对应该使用链接标头。一个例子是链接缓存失效:

    https://datatracker.ietf.org/doc/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'
    }
    

    【讨论】:

      【解决方案3】:
      • 中介可以考虑链接头
      • 链接头由 SPDY 压缩
      • 链接头是标准的

      如果需要,它们甚至可以包含一些 JSON! https://datatracker.ietf.org/doc/html/draft-nottingham-link-hint-00

      这种方法允许在所有响应中同时传递:

      • 包含超媒体信息的链接标头
      • 专门用于资源表示的有效负载

      当然,资源表示可能包含以各种形式编码的链接,但使用链接标头可以提供站点动态结构中最重要的部分。

      让这个解决方案绝对吸引人的是恕我直言,“接受-发布”提示。

      【讨论】:

        【解决方案4】:

        您不能压缩标头。如果你有很多链接。这可能会有所作为。

        为链接提供上下文。链接头有anchor属性,但是没有标准化的片段路径语法所以YMMV。

        我想不出任何其他优点/缺点。

        【讨论】:

        • 除非我对 HTTP 规范的理解有误,否则如果客户端在“TE:”中指定了 gzip,您可以使用“Transfer-Encoding”。不过可能完全错了:)
        • @Evert 据此tools.ietf.org/html/… 传输编码仍然仅适用于有效载荷主体。压缩标头是 SPDY 声称它从中获得很多好处的事情之一。问题是它使中介更难检查标头。
        【解决方案5】:

        在我看来,使用这两种方法(响应正文中的链接标头和超媒体链接遵循标准格式,例如 HAL)可以让您的解决方案获得这两种方法的好处。当然,如果您的 REST 开发框架支持在两个地方自动创建链接,这听起来是个好主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-16
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          相关资源
          最近更新 更多