Apa yang terlintas dalam pikiran saya adalah: jangan biarkan Anda RESTful API mencerminkan kekambuhan dalam URL itu sendiri. Kalau dipikir-pikir, sumber daya Anda hanya dokumen.
Jika Anda menyimpan dokumen Anda secara fisik sesuai dengan struktur rekursif, buat pemetaan ke ID unik, dan gunakan ID di URL:
/rest/documents/{id}
Sekarang, jika Anda memiliki dokumen Anda seperti ini:
| DocumentName | DocumentPath | DocumentID |
--------------------------------------------
| abc | / abc | 1 |
| asd | / abc / asd | 2 |
| asd | / asd | 3 |
| boo | / abc / asd / boo | 4 |
| hai | / abc / asd / hey | 5 |
permintaan akan berkonsultasi dengan url ini untuk /abc/asd
dokumen
GET /rest/documents/2
Jadi, sekarang Anda harus memberi pengguna API Anda sarana untuk melintasi struktur Anda dengan sedikit usaha. Itu bisa dilakukan dengan membungkus muatan respons Anda (dokumen) ke objek, yang berisi informasi traversal tambahan, seperti ini:
{
data: { /* your document goes here */ },
parent: {"abc": 1 },
children: [ { "boo": 4 }, { "hey": 5} ]
}
asalkan Anda berharap pengguna tidak membuat terlalu banyak dokumen dalam satu tingkat, Anda dapat memasukkan daftar anak-anak ke dalam respons. Jika bukan itu masalahnya Anda bisa menawarkan pengguna untuk mengambil ID dokumen anak seperti itu, memungkinkan misalnya untuk mem-paging hasil melalui parameter querystring:
GET /rest/documents/2/children?page=2&size=50
Akhirnya, berbicara tentang parameter querystring, Anda juga bisa menyediakan informasi path secara langsung melalui parameter querystring:
GET /rest/documents?path=somepath&page=1&size=42
Semua pendekatan yang disebutkan berharap bahwa dataran GET /rest/documents
hanya mengembalikan dokumen root.