Apa struktur URL tenang terbaik untuk sumber daya rekursif?


10

Saya membuat layanan RESTfull untuk struktur sumber daya seperti pohon dan bertanya-tanya seperti apa struktur URL yang terbaik?

Saya memiliki tiga persyaratan:

  1. bisa mendapatkan koleksi sumber daya root
  2. bisa mendapatkan sumber daya individual
  3. bisa mendapatkan koleksi sumber daya anak

Pikiran saya saat ini adalah:

/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents

Saya juga berpikir untuk pergi rute tunggal / jamak untuk menunjukkan daftar atau elemen individu, tetapi saya tahu saya akan memiliki sumber daya yang jamak yang sama dengan singular, jadi memutuskan menentang ini.

Adakah yang punya pemikiran di atas? atau memiliki cara penataan yang berbeda / lebih baik?


Saya mungkin salah paham pertanyaannya tetapi ketika kita berbicara tentang url apakah SEO masalah?
Jon Hopkins

SEO bukan masalah, tidak. Saya pada dasarnya meminta struktur URL logis terbaik untuk sumber referensi mandiri.
Matt Brailsford

Bagi saya itu kelihatannya cukup lurus.
Tim Post

Seberapa dalam struktur itu bisa berjalan?
Martijn Verburg

@ Martijn kedalamannya tidak dibatasi
Matt Brailsford

Jawaban:


11

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/asddokumen

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/documentshanya mengembalikan dokumen root.


1
Ide bagus. Namun, hubungan dengan dokumen anak tidak jelas dari API jika dokumen anak dimasukkan dalam respons untuk dokumen. Jika dokumen juga memiliki sub-sumber daya lain, misalnya komentar, Anda biasanya akan mengakses pertanyaan untuk dokumen menggunakan / dokumen / {id} / pertanyaan. Agar konsisten dan membuat hubungan dengan dokumen anak jelas dalam API, saya akan menyarankan bahwa dokumen anak harus diakses oleh / dokumen / {id} / dokumen anak. Representasi yang dikembalikan akan menjadi Dokumen seperti / document / {id}. Jadi, sisa dari apa yang Anda uraikan di sini masih berfungsi juga.
Nathan Ward

2

Sesuatu seperti ini mungkin:

/rest/{rootEntity}/Item/{leafEntity}/{id}
/rest/{entity}/ItemList
/rest/{entity}/ItemList/{leafEntity}

di mana {rootEntity} adalah titik awal koleksi Anda, {leafEntity} adalah sembarang simpul daun bernama di dalam pohon Anda.

Anda dapat menambahkan beberapa parameter di atas untuk memilih, mengatakan, Terbaru atau Semua atau sesuatu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.