Я пытаюсь выяснить «правильную» реализацию структуры URL-адресов для приложения с поддержкой мультитенантности и общими ресурсами.
Ресурсы: пользователи, проекты
Схема URL-адреса
host/api/tenant_id/resource[/id][/subresource][/id]
Пользователь A (width id = 1) получает коллекцию своих проектов по адресу
GET http://example.com/api/1/projects/
Пользователь A создает новый проект, доступный для чтения
GET http://example.com/api/1/projects/2
Теперь пользователь A предоставляет другому пользователю B (id = 2) доступ к проекту 2. Пользователь B хотел бы видеть коллекцию всех проектов, связанных с его учетной записью, через:
GET http://example.com/api/2/projects/
Должен ли общий проект (id = 2) находиться в этой коллекции помимо тех, которые пользователь B создал сам? Или есть лучшая структура именования общих ресурсов?
2 ответа
Сосредоточение внимания на дизайне структур URL-адресов на самом деле недопустимо для архитектур RESTful. Рой Филдинг:
REST API не должен определять фиксированные имена ресурсов или иерархии (очевидная связь клиента и сервера).
См. Также этот ответ.
Для вашей конкретной проблемы я бы вернул список (в основном произвольных) гипертекстовых ссылок на проекты, к которым у пользователя есть доступ. Ссылки будут содержать атрибуты, дающие понять, принадлежит ли проект «пользователю» или «доступен» он. Чтобы улучшить читаемость, вы можете оформить URL-адреса ресурсов как
http://example.com/user/{user id}
http://example.com/project/{project id}
Представление пользователя после http://example.com/user/2 GET будет содержать список ссылок вроде
<a href="http://example.com/project/1" class="owned"/>
<a href="http://example.com/project/2" class="access-permitted"/>
Принцип HATEOAS является неотъемлемой частью REST и делает большинство вопросов «как создать свои URI» устаревшими :
Принцип заключается в том, что клиент взаимодействует с сетевым приложением полностью через гипермедиа, динамически предоставляемую серверами приложений. Клиенту REST не требуются предварительные знания о том, как взаимодействовать с каким-либо конкретным приложением или сервером, помимо общего понимания гипермедиа.
Возможно, одним из преимуществ может быть использование информации о клиенте в пути. Таким образом мы можем легко получить, например, списки объектов. Запрос uri в get / tenant-id / projects У нас может быть список проектов для каждого арендатора входа. Как можно попасть без информации об арендаторе в url?
Мои 2 цента
Похожие вопросы
Связанные вопросы
Новые вопросы
api
НЕ ИСПОЛЬЗОВАТЬ. Вместо этого используйте специальные теги, например [google-cloud-platform], [facebook], [amazon-web-services] или [api-design]. Вопросы с просьбой порекомендовать или найти API не по теме.