Что мне приходит в голову: не позволяйте RESTful API отражать рекурсивность в самом URL. Если подумать, ваш ресурс - это только документы.
Если ваши документы хранятся физически в соответствии с рекурсивной структурой, создайте сопоставление с уникальным идентификатором и используйте идентификатор в URL:
/rest/documents/{id}
Теперь, если у вас есть такие документы:
| DocumentName | DocumentPath | DocumentID |
--------------------------------------------
| abc | / abc | 1 |
| ASD | / abc / asd | 2 |
| ASD | / ASD | 3 |
| бу | / abc / asd / boo | 4 |
| эй | / abc / asd / hey | 5 |
запрос свяжется с этим URL для /abc/asd
документа
GET /rest/documents/2
Итак, теперь вы должны предоставить пользователям вашего API средства для обхода вашей структуры без особых усилий. Это можно сделать, обернув вашу ответную полезную нагрузку (документ) в объект, содержащий дополнительную информацию о прохождении, например:
{
data: { /* your document goes here */ },
parent: {"abc": 1 },
children: [ { "boo": 4 }, { "hey": 5} ]
}
при условии, что вы ожидаете, что пользователи не будут создавать слишком много документов на одном уровне, вы можете включить в ответ список детей. Если это не так, вы можете предложить пользователю получить идентификаторы дочерних документов следующим образом, например, для подкачки результатов с помощью параметров строки запроса:
GET /rest/documents/2/children?page=2&size=50
Наконец, говоря о параметрах строки запроса, вы также можете указать информацию о пути непосредственно через параметры строки запроса:
GET /rest/documents?path=somepath&page=1&size=42
Все упомянутые подходы предполагают, что равнина GET /rest/documents
возвращает только корневые документы.