JSON API问题。包括与关系

时间:2016-03-14 15:40:15

标签: ruby-on-rails json json-api

我在构建API端点之前正在阅读this。我读到有关复合文件的引用:

  

为了减少HTTP请求的数量,服务器可以允许响应   包括相关资源以及请求的主要资源   资源。这些回复被称为"复合文件"。

以下是使用JSON API规范的示例JSON响应:

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!"
    },
    "links": {
      "self": "http://example.com/articles/1"
    },
    "relationships": {
      "author": {
        "links": {
          "self": "http://example.com/articles/1/relationships/author",
          "related": "http://example.com/articles/1/author"
        },
        "data": { "type": "people", "id": "9" }
      },
      "comments": {
        "links": {
          "self": "http://example.com/articles/1/relationships/comments",
          "related": "http://example.com/articles/1/comments"
        },
        "data": [
          { "type": "comments", "id": "5" },
          { "type": "comments", "id": "12" }
        ]
      }
    }
  }],
  "included": [{
    "type": "people",
    "id": "9",
    "attributes": {
      "first-name": "Dan",
      "last-name": "Gebhardt",
      "twitter": "dgeb"
    },
    "links": {
      "self": "http://example.com/people/9"
    }
  }, {
    "type": "comments",
    "id": "5",
    "attributes": {
      "body": "First!"
    },
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "2" }
      }
    },
    "links": {
      "self": "http://example.com/comments/5"
    }
  }, {
    "type": "comments",
    "id": "12",
    "attributes": {
      "body": "I like XML better"
    },
    "relationships": {
      "author": {
        "data": { "type": "people", "id": "9" }
      }
    },
    "links": {
      "self": "http://example.com/comments/12"
    }
  }]
}

从我所看到的,关系部分提供有关articles表和其他表之间关联的基本/稀疏信息。它看起来像一篇文章belongs_to作者和has_many评论。

链接将用于什么? API是否必须使用该链接才能获得有关该关系的更详细的JSON?这不需要额外的API调用吗?这有效吗?

"包括"部分似乎包含有关关系/关联的更详细信息?

是否包括""和"关系"必要?需要这两个部分背后的直觉是什么?

1 个答案:

答案 0 :(得分:3)

我们的想法是,relationship中的resource只会提供关联数据(这是唯一标识相关resource的基本数据 - 这些数据是idtype),以便将其保持在最低限度。

另一方面,如果您要发送有关某些相关included的详细信息(例如,以最小化HTTP请求的数量),resources部分就在这里。请注意,included部分应包含与resources相关的 primary resource(即data部分内),或者included资源(此约束在规范中称为full linkage

简单地说,relationships的{​​{1}}部分会告诉您哪个 resource与给定的resources相关,并且resource部分告诉您 那些included是什么。

就链接而言,当您有resources关系时,它们可能会派上用场,链接数据本身可能包含数千条has_many / id条记录,从而使您的回复文件非常大。如果客户在请求基础type时不一定需要这些内容,您可能会决定通过resource提供这些内容。