REST Api для ресурсных ассоциаций
Пытаясь смоделировать интерфейс REST для системы, мне трудно понять, какой подход будет наилучшим.
Рассмотрим наличие объекта типа resource
и другой объект, который описывает их ассоциации: resourceAssoc
, Ассоциации могут быть n
типы, но это не важно.
В случае resource
API будет тривиальным:
/resources
/resource/{resource_id}
Что будет лучшим подходом для resourceAssoc
учитывая, что его идентификатор состоит из: PK(from_resource_id, to_resource_id, association_type)
?
2 ответа
Я надеюсь, что мой ответ даст некоторые подсказки, так как я не совсем понимаю ваш вопрос;-)
На самом деле, я вижу следующие возможности в отношении URL-адресов REST и содержимого ответа:
/ ресурсов /{resource_id}/ ассоциации /
[ { "toResourceId": "resourceid1", "associationKind": "kind1", (...) }, { "toResourceId": "resourceid2", "associationKind": "kind2", (...) } (...) ]
/ ресурсов /{resource_id}/ объединения /{to_resource_id}
[ { "associationKind": "kind1", (...) }, { "associationKind": "kind2", (...) } (...) ]
/ ресурсов /{resource_id}/ объединения /{to_resource_id}
{ (...) }
Следующие вводят новый путь корневого ресурса associations
, В этом случае вы можете управлять ассоциациями независимо от ресурсов с корневым путем. resources
,
/ ассоциации / {from_resource_id}, {to_resource_id} /
[ { "fromResourceId": "resourceid1", "toResourceId": "resourceid2", "kind": "kind1", (...) }, (...) ]
/ ассоциации /{from_resource_id},{to_resource_id}/{вид}
{ "fromResourceId": "resourceid1", "toResourceId": "resourceid2", "kind": "kind1", (...) }
Обратите внимание, что вы можете применить несколько HTTP-методов к этим URL-адресам, чтобы получать контент, а также управлять им (обновлять, удалять).
Я думаю, что вы также можете рассмотреть возможность иметь ресурсы только с корневым путем resources
и управлять директивами ассоциаций в пределах полезной нагрузки.
Вот образец:
GET /resources/<resource_id>/associations/
[
{
"toResourceId": "resourceId1",
"kind": "kind"
(...)
},
{
"toResourceId": "resourceId2",
"kind": "kind"
(...)
},
(...)
]
Чтобы управлять этими ассоциациями, вы можете реализовать метод PATCH
описание того, что вы хотите обновить:
PATCH /resources/<resource_id>/associations/
[
{ "action": "add", "toResourceId":"resourceId1","kind":"kind1" (...) },
{ "action": "delete", "toResourceId":"resourceId2","kind":"kind2" (...) },
]
Эта ссылка может помочь вам в этом подходе: http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/.
В заключение, мы можем заметить, что технология OData поддерживает отношения между элементами с ее функцией "навигационные ссылки", но не существует вашей концепции вида ассоциации.
Надеюсь, это поможет тебе, Тьерри
Я не уверен, что здесь есть объективно "лучший" ответ. Существуют различные способы сделать это, следуя принципам REST. Сказав это, я бы предложил:
/{association_type}/{from_resource_id}/{to_resource_id}
или, если это недостаточно ясно, основываясь на типах ассоциации:
/association/{association_type}/{from_resource_id}/{to_resource_id}
РЕДАКТИРОВАТЬ:
Исходя из ваших комментариев, может быть, что-то вроде этого больше подходит:
/associations/from/{from_resource_id}/to/{to_resource_id}
а также:
/associations/to/{to_resource_id}
Это было бы самым явным. Опять же, я думаю, здесь много места для творчества. Многое зависит от того, ожидаете ли вы, что люди будут вводить их самостоятельно или создавать пути, а не извлекать их из других частей вашего API.