Saya mencoba membuat API sisanya untuk aplikasi android. Misalkan saya punya users
tabel dengan (id, name, email)
dan songs
meja dengan (id, song_name, album)
dan kaya bergabung hubungan antara mereka sebagai streams
memiliki (user_id, song_id, listen_count)
. Saya ingin mengambil detail tentang semua aliran dan menunjukkannya di aplikasi sebagai daftar. Daftar akan menampilkan nama lagu, nama album, nama pengguna dan jumlah mendengarkan. Saya melihat tiga opsi yang masuk akal -
GET
ke/streams
dan mengambil daftar semuasong_ids
danuser_ids
. Kemudian buatGET
ke/user/:id
dan/song/:id
untuk setiap pengguna dan id lagu untuk mendapatkan informasi pengguna dan lagu.GET
ke/streams
dan mengambil daftar semuauser_ids
dansong_ids
. Kemudian salah satuGET
untuk/user?ids=<comma_separated_ids>
mengambil informasi tentang semua pengguna danGET
untuksong?ids=<comma_separated_ids>
mengambil informasi tentang semua lagu.GET
untuk/streams
dan mengambil semuanya dalam satu panggilan. Sesuatu seperti -[ { "user_id" : 10, "song_id" : 14, "listen_count" : 5, "user" : { "id" : 10, "name" : "bla", "email" : "bla", }, "song" : { "id" : 14, "name" : "blu", "album" : "blu" } }, ... ]
Saya tergoda untuk menggunakan opsi 3 karena memberi saya segalanya dalam satu panggilan, tetapi saya tidak berpikir itu sangat tenang dan saya khawatir itu tidak akan terukur. Opsi 2 baik tetapi dibutuhkan 3 panggilan yang berarti cukup banyak waktu memuat daftar. Dan opsi 1 mengikuti istirahat tetapi akan menerima banyak panggilan untuk menunjukkan daftar dan melakukan begitu banyak panggilan dari perangkat seluler tidak layak.
Apa yang akan menjadi cara yang disarankan untuk melakukan ini?
Jawaban:
Saat membuat antarmuka REST, tidak ada persyaratan, atau bahkan harapan, bahwa respons pada antarmuka REST berhubungan langsung dengan tabel atau bergabung dalam database.
/streams
Antarmuka Anda dapat dengan mudah direpresentasikan sebagaiDi mana objek JSON berisi detail utama pengguna dan lagu yang (hampir) selalu relevan bagi konsumen sumber daya streaming, dan tautan ke sumber daya pengguna / lagu yang relevan jika diperlukan rincian lebih lanjut.
Ini pada dasarnya adalah variasi dari opsi ketiga Anda, dengan mundur ke opsi 1 jika diperlukan lebih banyak detail.
sumber
Course
->Teacher
(informasi tentang orang tersebut sebagai guru, disimpan dalam tabel terpisah) ->Person
(orang fisik, seperti yang Anda ingat orang yang sama dapat menjadi guru dari beberapa Kursus). Opsi 2 scalable, dan membutuhkan * permintaan. Juga memilih. 1 juga dapat diskalakan, tetapi bisa membutuhkan >> permintaan.Anda pasti menginginkan satu
GET
operasi yang mengembalikan metadata tentang setiap lagu dan pengguna selain id buram mereka.sumber
rest-full
desain, bukan? SebuahGET
untukstreams
harus mengembalikan semuastreams
dan tidak ada yang lain (bahkan jika mereka hanya id dan berguna untuk klien).streams
sumber daya dapat secara logis mengandung (bagian dari) sumber daya lainnya. Hal-hal yang secara logis merupakan bagian dari sumber daya harus ada dalam representasi sumber daya itu.