0

假设我们有几个资源,它们可以单独存在,也可以按树状层次结构组织。为了方便起见,我称它们为根、树枝和叶子。现在我想检索叶子的数据:

GET /leaf/1
Accept: application/vnd.api+json

根据JSON API 规范,它必须返回我这样的东西:

{
    "data": [{
    "type": "leaf",
    "id": "1",
    "title": "Leaf 1",
    "links": {
        "self": "http://example.com/leaf/1",
        "branch": {
            "self": "http://example.com/leaf/1/links/branch",
            "related": "http://example.com/leaf/1/branch",
            "linkage": { "type": "branch", "id": "5" }
        },
        "root": {
            "self": "http://example.com/leaf/1/links/root",
            "related": "http://example.com/leaf/1/root",
            "linkage": { "type": "root", "id": "7" }
        }
    }
    }],
    "included": [{
        "type": "branch",
        "id": "5",
        "title": "Branch 5",
        "links": {
            "self": "http://example.com/branch/5"
        }
    }, {
        "type": "root",
        "id": "7",
        "title": "Root 7",
        "links": {
            "self": "http://example.com/root/7"
        }
    }]
}

从响应数据中,我不能说数据是分层的,并且更改叶子的根似乎是合适的:

PATCH /leaf/1
Content-Type: application/vnd.api+json

{
    "data": {
        "type": "leaf",
        "id": 1,
        "links": {
            "root": {
                "linkage": { "type": "root", "id": "3"}
            }
        }
    }
}

这当然是不可能的,因为这个叶子连接到分支,然后才连接到根,并且在下面的模式中更改根需要有这个根分支的 id。问题是:

  1. 如何(如果可能)在资源表示中表示层次结构,以使 API 用户清楚地知道变化的关系可能需要额外的数据?
4

2 回答 2

0

您的示例的问题是您将数据视为叶子和分支,而不是单独的对象。

REST 是关于管理实体的。尝试将 REST URL 视为实体的名称。不是一些花哨的树指针。

因此,在您的情况下,不可能像那样修补叶子。要更改实体,您必须使用创建它时使用的相同路径。

于 2015-04-18T16:25:51.570 回答
0

我知道这个答案已经晚了,但我只是把它留给将来的其他人。

我认为要走的路是用指向父节点的单个“父”关系替换“分支”和“根”关系(这当然是在某个根下的分支上)。然后,可以将父关系修补到任何其他节点,而不会引入不一致(因为这是之前有人修补根而不是分支的问题)。

然后,如果您仍然想公开根节点,而不仅仅是直接父节点,您可以将此信息放在meta某个地方,您可以添加回“根”关系但不能使其可写(即 PATCH 尝试将返回 400/403) , ETC。

于 2015-08-29T22:46:04.763 回答