JSON API автоматические обратные ссылки - PullRequest
0 голосов
/ 28 мая 2019

Является ли нарушением спецификации JSON-API разрешение автоматически создавать обратные отношения?

Мне нужно создать ресурсы, которые, когда я связываю A с B в отношениях, автоматически связывают B с A. Таким образом, я могу пройти A, чтобы найти все его B и найти родителя A из B. Однако Я не хочу POST / PATCH для 2 отношений, чтобы получить это право. Я хочу установить отношения один раз.

Теперь я знаю, что это деталь реализации того, как сервер поддерживает ссылки / ссылки, а также как устанавливается поведение, но я хочу построить API таким образом, чтобы он не нарушал спецификации.

При условии, что у меня есть ресурсы Книги и Авторы. Книги есть у авторов и у авторов есть книги. Вопрос в том, когда я связываю автора с книгой, мне нужно создать и обратные отношения. Является ли нарушение спецификации каким-либо образом предположить, что это обратное отношение может быть автоматически создано простым выполнением одного POST-отношения с ресурсом Books?

Например, начиная с книги.

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

Нужно ли явно делать то же самое для Автора 456 как POST для /authors/456/relationships/books?

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

Или я могу позволить серверу построить отношения для меня, чтобы я мог избежать второго POST и просто увидеть автоматическое обратное отношение в GET /authors/456/relationships/books?

1 Ответ

1 голос
/ 28 мая 2019

С точки зрения спецификации это только одно отношение, представленное с двух разных сторон. author и book имеют отношения многие ко многим. Это отношение может быть представлено в объекте ресурса author, а также в объекте ресурса book и, конечно, также через ссылки. На самом деле это было бы нарушением духа спецификации, если представления не будут совпадать. Наличие односторонних отношений - это другая история, но в этом случае одна сторона вообще не будет знать об отношениях (например, book связана с author, но модель 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" }
          ]
        }
      }
    }
  ]
}
...