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 aFoo
. Namun, seperti yang saya tulis di atas, mungkin saja beberapaFoo
s berbagi samaBar
. Seharusnya dimungkinkan untuk membuatFoo
tanpaBar
terkait, jadi saya tidak berpikirBar
harus diperlakukan sebagai orang tua.Jawaban:
Sebuah level 3 SISA API akan kembali Anda
Foo
dan juga link yang menunjukkan terkaitBar
.Anda kemudian dapat menambahkan fitur "menelusuri" ke API Anda yang memungkinkan navigasi tautan;
Fitur drill down akan duduk di depan API dan mencegat respons. Itu akan membuat panggilan bor dan mengisi rincian sebelum menyerahkan respon kembali ke penelepon.
Ini adalah hal yang cukup umum di REST level 3 karena banyak mengurangi keresahan klien / server melalui http lambat. Perusahaan tempat saya bekerja menghasilkan API REST level 3 dengan fitur yang tepat ini.
Pembaruan: Untuk apa nilainya, berikut ini tampilannya di JSON. Ini adalah bagaimana API kami akan menyusunnya. Perhatikan bahwa Anda dapat membuat sarang bor untuk menarik tautan tautan, dll.
sumber
links
larik, setiap entri adalah objek tautan dengan bidangrel
a dan auri
(mirip dengan contoh xml Anda). Haruskah saya menambahkan bidang ketiga ke setiap objek tautan (mis.data
)? Apakah ada standar?Jika 95% dari semua pertanyaan inginkan
Foo
sertaBar
, maka cukup mengembalikannya dalam dariFoo
objek saat Anda memintaFoo
. Cukup tambahkan propertibar
(atau istilah lain untuk hubungan), dan letakkanBar
objek di sana. Jika hubungannya tidak ada, gunakan null.Saya pikir Anda terlalu memikirkan ini :)
sumber
Foo
, dan karena masingBar
- masing cukup besar dalam memori (sekitar 3x-4x ukuranFoo
), saya tidak ingin mengembalikan aBar
jika klien tidak meminta secara eksplisit.