Saya sedang dalam proses membuat API REST dan saat ini, saya menghadapi masalah berikut:
Foo
adalah sumber pertama. Operasi CRUD dapat diterapkan melalui/foo/
URI.Bar
adalah sumber kedua. Operasi CRUD dapat diterapkan melalui/bar/
URI.- Setiap
Foo
dikaitkan dengan nol atau satuBar
. Alasan mengapa saya tidak memperlakukanBar
sebagai sub-sumber dayaFoo
adalah karenaBar
contoh yang sama dapat dibagi antara mutipleFoo
s. Jadi saya pikir lebih baik untuk mengaksesnya melalui URI independen/foo/[id]/bar
.
Masalah saya adalah bahwa dalam banyak kasus, klien yang meminta Foo
contoh juga tertarik pada Bar
contoh terkait . Saat ini, ini berarti bahwa mereka harus melakukan dua kueri alih-alih satu. Saya ingin memperkenalkan cara yang memungkinkan untuk mendapatkan kedua objek dengan satu permintaan tunggal, tapi saya tidak tahu bagaimana memodelkan API untuk melakukan itu. Apa yang saya dapatkan sejauh ini:
- Aku bisa memperkenalkan parameter permintaan seperti ini:
/foo/[id]?include_bar=true
. Masalah dengan pendekatan ini adalah bahwa representasi sumber daya (misalnya struktur JSON) dari respons perlu terlihat berbeda (misalnya wadah seperti{ foo: ..., bar: ... }
bukan hanya serialFoo
), yang membuatFoo
titik akhir sumber daya "heterogen". Saya pikir itu bukan hal yang baik. Saat bertanya/foo
, klien harus selalu mendapatkan representasi (struktur) sumber daya yang sama, terlepas dari parameter kueri. - Gagasan lain adalah untuk memperkenalkan titik akhir baca-saja yang baru, misalnya
/fooandbar/[foo-id]
. Dalam hal ini, tidak ada masalah untuk mengembalikan representasi seperti{ foo: ..., bar: ... }
, karena dengan demikian hanya representasi "resmi" darifooandbar
sumber daya. Namun, saya tidak tahu apakah titik akhir pembantu seperti itu benar-benar tenang (ini sebabnya saya menulis "bisa" di judul pertanyaan. Tentu saja secara teknis memungkinkan, tetapi saya tidak tahu apakah itu ide yang bagus).
Bagaimana menurut anda? Apakah ada kemungkinan lain?
Bar
tidak dapat ada tanpa dikaitkan dengan a Foo
. Namun, seperti yang saya tulis di atas, mungkin saja beberapa Foo
s berbagi sama Bar
. Seharusnya dimungkinkan untuk membuat Foo
tanpa Bar
terkait, jadi saya tidak berpikir Bar
harus diperlakukan sebagai orang tua.