Идентификаторы JSON API для вложенных ресурсов относительно родительского - PullRequest
0 голосов
/ 21 мая 2019

Когда моделируются отношения ресурсов, классический пример дает для articles и comments. Это становится простым для моделирования, потому что:

  • статьи могут быть однозначно идентифицированы: / Articles / 1
  • комментариев можно однозначно идентифицировать: / comments / 2
  • их отношения могут быть предоставлены как / article / 1 / comments, в которых будут возвращаться только комментарии к этой статье

Но как справиться со случаем, когда связанный ресурс существует только в контексте родителя?

Например, order и items:

  • заказ может быть однозначно идентифицирован / orders / 123
  • элементы в этом порядке существуют только как / orders / 123 / items
  • и НЕ как / items

В JSON-API объекту взаимосвязи нужны "тип" и "id", чтобы указать связь:

"relationships": {
    "links": {
        "self": "http://example.com/orders/123/relationships/items",
        "related": "http://example.com/orders/123/items"
    },
    "data": {
        "type": <what goes here>,
        "id": <what goes here>
    }
}

Тип и идентификатор для данных должны соответствовать номеру заказа 123. Предполагая, конечно, что им не присваивается UUID или что-либо подобное из базы данных, поскольку они, по сути, являются составным ключом. Они существуют главным образом как комбинация внешних ключей.

Как с этим справиться?

Один из вариантов отношения - использовать тип как order_item, а идентификатор - как хеш или что-то с разделением строк, объединяя идентификатор заказа и идентификатор элемента. (например, 123_abc). 123 Я получаю от заказа, и ABC я получаю от товара в заказе.

Есть ли другой способ, кроме того, чтобы вообще избегать необходимости обеспечивать связь с ресурсами?

1 Ответ

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

Каждый ресурс должен быть уникально идентифицирован комбинацией type и id в соответствии со спецификацией JSON API:

Идентификация

Каждый объект ресурса ДОЛЖЕН содержать член id и член типа. Значения элементов id и type ДОЛЖНЫ быть строками.

В данном API каждая пара типов и идентификаторов объекта ресурса ДОЛЖНА идентифицировать один уникальный ресурс. (Набор URI, контролируемых сервером или несколькими серверами, действующими как один, составляет API.)

https://jsonapi.org/format/#document-resource-object-identification

Для этого вам требуется не только идентификатор для привязки ресурса , но и для создания любого правильного ответа, включая такой ресурс.

Но нет правил о том, как генерировать эти уникальные идентификаторы для каждого типа. Объединение уникального идентификатора заказа с уникальным идентификатором товара для получения уникального идентификатора для каждого товара в заказе кажется хорошим подходом, если ваша модель данных не содержит идентификатора.

...