【问题标题】:Dealing with tree-like data structures in JSON API在 JSON API 中处理树状数据结构
【发布时间】:2015-06-10 23:06:25
【问题描述】:

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

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

根据JSON API spec,它必须返回给我类似的东西:

{
    "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"
        }
    }]
}

从响应数据我不能说数据是分层的,它似乎适合change叶子的根:

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

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

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

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

【问题讨论】:

    标签: json api rest json-api


    【解决方案1】:

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

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

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

    【讨论】:

    • 它们独立的对象,但可以分层组织。请提供一个示例,如何使用创建它的路径更改“叶子”的“根”。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 2023-04-02
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      相关资源
      最近更新 更多