Я создаю сервис RESTfull для древовидной структуры ресурсов, и мне было интересно, какой будет лучшая структура URL?
У меня есть три требования:
- быть в состоянии получить коллекцию корневых ресурсов
- быть в состоянии получить индивидуальный ресурс
- быть в состоянии получить коллекцию дочерних ресурсов
Моя текущая мысль:
/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents
Я также думал о том, чтобы пойти по пути единственного / множественного числа для обозначения списков или отдельных элементов, но я знаю, что у меня будет ресурс, который является таким же множественным числом, как и единственное число, поэтому решил отказаться от этого.
У кого-нибудь есть мысли по поводу вышесказанного? или есть другой / лучший способ структурирования этого?
web-services
Мэтт Брэйлсфорд
источник
источник
Ответы:
Что мне приходит в голову: не позволяйте RESTful API отражать рекурсивность в самом URL. Если подумать, ваш ресурс - это только документы.
Если ваши документы хранятся физически в соответствии с рекурсивной структурой, создайте сопоставление с уникальным идентификатором и используйте идентификатор в URL:
Теперь, если у вас есть такие документы:
запрос свяжется с этим URL для
/abc/asd
документаИтак, теперь вы должны предоставить пользователям вашего API средства для обхода вашей структуры без особых усилий. Это можно сделать, обернув вашу ответную полезную нагрузку (документ) в объект, содержащий дополнительную информацию о прохождении, например:
при условии, что вы ожидаете, что пользователи не будут создавать слишком много документов на одном уровне, вы можете включить в ответ список детей. Если это не так, вы можете предложить пользователю получить идентификаторы дочерних документов следующим образом, например, для подкачки результатов с помощью параметров строки запроса:
Наконец, говоря о параметрах строки запроса, вы также можете указать информацию о пути непосредственно через параметры строки запроса:
Все упомянутые подходы предполагают, что равнина
GET /rest/documents
возвращает только корневые документы.источник
Возможно, что-то вроде этого:
где {rootEntity} - отправная точка вашей коллекции, {leafEntity} - любой именованный листовой узел в вашем дереве.
Вы можете добавить несколько параметров к любому из вышеперечисленных, чтобы выбрать, скажем, Последний или Все или что-то еще.
источник