JSON API自动反向链接

时间:2019-05-27 23:47:20

标签: json-api

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

我需要创建资源,当我在关系中将A链接到B时,会自动将B链接到A。通过这种方式,我可以遍历A以找到其所有B,并可以从B中找到父A。 ,我不想将POST / PATCH关联到2种关系来解决此问题。我想一次建立关系。

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

假设我有资源书籍和作者。书有作者,作者有书。问题是,一旦我将作者与书联系起来,我还需要创建反向关系。 以某种方式认为仅通过对“图书”资源的关系进行一次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"
        }
     }
}        

如果我建立了从书到作者的链接,并通过POST到/books/123/relationships/authors

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

我是否需要对Author 456进行明确的操作,作为对/authors/456/relationships/books的POST?

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

或者我可以让服务器为我建立关系,以便避免第二次POST,而只是在GET /authors/456/relationships/books上看到自动反向关系吗?

1 个答案:

答案 0 :(得分:1)

从规范的角度来看,这只是从两个不同方面表示的一种关系。 authorbook具有多对多关系。此关系可以表示在author的资源对象中,也可以表示在book的资源对象中,当然也可以通过那里的关系链接表示。如果表示形式不匹配,实际上将违反规范的精神。具有单向关系是另一回事,但在那种情况下,一侧根本不会知道这种关系(例如,bookauthor相关联,但author模型却没有知道与哪些书相关联。

在该关系的任一侧发布都会在两个记录之间创建关系。哪一方用来创建该关系,以及是否通过资源对象或代表该关系的关系链接将其创建为对资源的创建/更新都无关紧要。删除该关系也是如此。

也许一个例子可以使这一点更加清楚。假设创建一本书,其中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" }
          ]
        }
      }
    }
  ]
}