【问题标题】:Should JSON API entities include a relationship for its parent?JSON API 实体是否应该包含与其父级的关系?
【发布时间】:2018-09-12 04:56:13
【问题描述】:

一直没能找到明确的答案,希望有人能帮忙。

例如,如果我们有一个包含帖子的博客,并且每个帖子都可以有 cmets,并且每个评论都有一个相关用户。如果我请求评论,将用户都包含在关系中是否违反惯例?

data: {
  type: 'comments',
  id: '1',
  relationships: {
    post: {...}, //should this be here?
    user: {...},
  }
  attributes: {...},
},
included: {...}

【问题讨论】:

    标签: json-api coding-style


    【解决方案1】:

    正如 paulsm4 正确地指出:“这取决于你”。

    但我可以给你一些建议。

    在这种情况下,您可以通过查询字符串标志让 API 的调用者选择是否拥有此类链接,例如

    ?relationships=post,user

    在这种情况下,如果您不指定关系标志,您将获得简单的评论数据,或者您可以决定全部提供;在第二种情况下,您可以使用 relationships 作为一种过滤器。

    在某些 API 中,我还看到了一种更具侵入性的方法:将相关对象直接嵌入到返回的 JSON 中。

    使用与之前相同的技术:

    ?embed=post,user

    这应该会在当前 JSON 回复中生成一个嵌入的 JSON 对象,包括原始对象,就像您分别询问“GET /post/123”或“GET /user/456”之类的内容一样。这在某些情况下会很方便。

    这个标志通常被命名为“expand”,表示相同或相似的行为。

    例如打开this API documentation from Atlassian并搜索“expand”。

    对于您的问题确实存在一个旧的“标准”,称为 HAL,它谈到了 REST API 中的链接和嵌入。

    即使是 Wordpress API 也提供此类功能,请查看 official documentation

    对此的替代方法是利用 REST 方法在 GraphQL 中重写整个 API。

    【讨论】:

    • 答案与 JSON API 规范无关。在 JSON API 规范中,您有 include 查询参数来要求服务器包含一些相关记录。然后将响应称为Compound Document。没有理由向 API 使用者隐藏关系,尤其是默认行为。
    【解决方案2】:

    问:JSON API 实体是否应该包含与其父级的关系?

    A:我想这完全取决于你!

    如果您的 JSON 是由某个第三方定义的,那么您必须接受他们提供的内容。请发布有关如何指定 JSON 的详细信息。

    否则,如果您自己“发明”格式:

    1. 一种可能性是有一个relationships: 字段,其中包含指向“父级”的链接。

    2. 也许更好的解决方案是发明一个“容器”(也许是一个简单的数组!)来保存您的“记录”。

    3. 如果这是一个数据库,我将有一个“posts”表和一个“cmets”表。 “cmets”表将有一个“Post ID”列作为“posts”表的外键。

    '希望能有所帮助......至少有点......

    【讨论】:

    【解决方案3】:

    JSON API 规范对资源对象中包含的属性关系没有任何要求。该规范只是说明如果包含它们,它们必须如何格式化。如果我没有遗漏任何内容,规范甚至不要求同一类型的所有资源对象必须具有相同的属性关系。 p>

    但我认为不包括关系没有任何价值。 JSON API 规范不要求 relationship object 包含 resource linkage 数据。相反,它仅在 compound document 的上下文中讨论资源链接数据,其中它用于“将所有包含的资源对象链接在一起,而无需通过链接获取任何 URL。”

    如果相关资源未包含在有效负载中,则仅提供related resource link 是完全有效的,并且可以被视为最佳实践。构建这样的链接不会给您的服务器带来任何工作量,因为它不需要查询数据库。它也不会对有效负载大小产生任何相关的影响。

    使用这两种技术的有效负载示例如下所示。它假定请求使用include query param 明确要求包含相关用户。

    // GET https://examples.com/api/v1/comments/1?include=user
    
    {
      data: {
        type: 'comments',
        id: '1',
        relationships: {
          post: {
            links: {
              related: 'https://examples.com/api/v1/comments/1/post'
            }
          },
          user: {
            data: {
              type: 'users',
              id: '2'
            },
            links: {
              related: 'https://examples.com/api/v1/comments/1/user'
            }
          },
        }
      },
      included: [
        {
          type: 'users',
          id: '2',
          attributes: {
            name: 'John Doe'
          }
        }
      ]
    }
    

    您可能还想包含一个relationship link,它“允许客户直接操纵关系”。规范的Update relationships chapter 深入探讨了使用关系链接可以完成的工作。

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 2023-02-23
      • 2016-06-29
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多