JSON API 自动反向链接

JSON API automatic reverse links

允许自动创建 reverse 关系是否违反了 JSON-API 规范?

我需要创建资源,当我 link A 到 B 的关系时,自动 link B 到 A。这样我就可以遍历 A 找到它的所有 B并且可以从 B 中找到父 A。但是,我不想 POST/PATCH 到 2 个关系来得到这个权利。我想建立一次关系

现在我知道这是关于服务器如何维护 link/references 以及行为如何建立的实现细节,但我想以这样的方式构建 API不违反规范。

假设我有书籍和作者资源。书有作者,作者有书。问题是,一旦我将作者与一本书相关联,我还需要创建反向关系。 假设可以通过简单地对 Books 资源的关系执行 POST 操作自动创建这种反向关系是否以任何方式违反规范?

举个例子,从书开始。

{
    "data": {
        "type": "books", "id": 123, "attributes": ...,
        "links": { "self": "/books/123" },
        "relationships": {
            "self": "/books/123/relationships/authors",
            "related": "/books/123/authors"
        }
     }
}        

和作者

{
    "data": {
        "type": "authors", "id": 456, "attributes": ...,
        "links": { "self": "/authors/456" },
        "relationships": {
            "self": "/authors/456/relationships/books",
            "related": "/authors/456/books"
        }
     }
}        

如果我建立 link 从书到作者 POST 到 /books/123/relationships/authors

{
    "data": [{ "data": "authors", "id": "456" }]
}

作为 POST 到 /authors/456/relationships/books,我是否需要明确地为作者 456 做同样的事情?

{
    "data": [{ "data": "books", "id": "123" }]
}

或者我可以让服务器为我建立关系,这样我就可以避免第二个 POST 并且只在 GET /authors/456/relationships/books 看到自动反向关系吗?

从规范的角度来看,这只是从两个不同方面表示的一种关系。 authorbook 有 many-to-many 关系。这种关系可以在 author 的资源对象以及 book 的资源对象中表示,当然也可以通过那里的关系 link 表示。实际上,如果表示不匹配,将违反规范的精神。拥有 one-sided 关系是另一回事,但在那种情况下,一方根本不知道这些关系(例如,bookauthor 关联,但 author 模型不知道与哪些书相关联)。

A post 该关系的任一侧创建两个记录之间的关系。使用哪一方来创建该关系以及它是通过资源对象还是通过表示该关系的关系 link 作为资源创建/更新的一部分创建的都无关紧要。这同样适用于删除该关系。

也许举个例子会更清楚。假设一本书是用 POST/books?include=author 创建的,具有这些有效负载:

{
  "data": {
    "type": "books",
    "relationships": {
      "author": {
        "data": {
          "type": "authors",
          "id": "1"
        }
      }
    }
  }
}

响应可能如下所示:

{
  "data": {
    "type": "books",
    "id": "7",
    "relationships": {
      "author": {
        "data": { "type": "authors", "id": "1" }
      }
    }
  },
  "included": [
    {
      "type": "authors",
      "id": "1",
      "relationships": {
        "books": {
          "data": [
            { "type": "books", "id": "7" }
          ]
        }
      }
    }
  ]
}