我在构建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调用吗?这有效吗?
"包括"部分似乎包含有关关系/关联的更详细信息?
是否包括""和"关系"必要?需要这两个部分背后的直觉是什么?
答案 0 :(得分:3)
我们的想法是,relationship
中的resource
只会提供关联数据(这是唯一标识相关resource
的基本数据 - 这些数据是id
和type
),以便将其保持在最低限度。
另一方面,如果您要发送有关某些相关included
的详细信息(例如,以最小化HTTP请求的数量),resources
部分就在这里。请注意,included
部分应包含与resources
相关的 primary resource
(即data
部分内),或者included
资源(此约束在规范中称为full linkage
。
简单地说,relationships
的{{1}}部分会告诉您哪个 resource
与给定的resources
相关,并且resource
部分告诉您 那些included
是什么。
就链接而言,当您有resources
关系时,它们可能会派上用场,链接数据本身可能包含数千条has_many
/ id
条记录,从而使您的回复文件非常大。如果客户在请求基础type
时不一定需要这些内容,您可能会决定通过resource
提供这些内容。