Я пытаюсь выяснить «правильную» реализацию структуры 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 создал сам? Или есть лучшая структура именования общих ресурсов?

1
Daniel 2 Мар 2015 в 12:19

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 не требуются предварительные знания о том, как взаимодействовать с каким-либо конкретным приложением или сервером, помимо общего понимания гипермедиа.

4
Community 23 Май 2017 в 12:00

Возможно, одним из преимуществ может быть использование информации о клиенте в пути. Таким образом мы можем легко получить, например, списки объектов. Запрос uri в get / tenant-id / projects У нас может быть список проектов для каждого арендатора входа. Как можно попасть без информации об арендаторе в url?

Мои 2 цента

0
peterbrown 28 Дек 2016 в 22:47