REST API Design: Beberapa panggilan vs. satu panggilan ke API

18

Kami sedang mengembangkan API Istirahat untuk situs web eCommerce yang akan dikonsumsi oleh aplikasi seluler.

Di halaman beranda aplikasi kita perlu memanggil beberapa sumber seperti Slider, Merek Top, Produk Terlaris, Produk Tren dll.

Dua opsi untuk melakukan panggilan API:

Panggilan Tunggal:

www.example.com/api/GetAllInHome

Banyak Panggilan:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

Yang merupakan pendekatan terbaik untuk desain api sisanya - panggilan tunggal atau ganda, jelaskan pro dan kontra?

Mana yang akan membutuhkan lebih banyak waktu untuk menanggapi permintaan?

shaijut
sumber

Jawaban:

14

Dalam Teori beberapa panggilan simultan lebih fleksibel dan sama cepatnya.

Namun, dalam praktiknya jika Anda memuat halaman, dan kemudian memuat setiap bagian halaman itu, menampilkan memuat pemintal di atasnya sampai Anda mendapatkan hasilnya kembali hasilnya lambat dan terputus-putus.

Untuk alasan ini, permintaan data AJAX harus digunakan dengan hemat dan hanya ketika Anda memiliki bagian halaman yang lambat dimuat atau perlu di-refresh pada siklus yang berbeda ke bagian halaman lainnya. Ucapkan tampilan master / detail, tempat Anda ingin memilih opsi dari master dan tampilkan detail yang sesuai tanpa memuat ulang master.

Desain yang umum adalah menjaga API terpisah untuk fleksibilitas pengkodean dan masalah layanan mikro, tetapi menggabungkan sisi server data di situs web. sehingga klien hanya perlu melakukan satu panggilan ke situs webnya sendiri. Panggilan API dengan caching yang sesuai harus cepat di dalam pusat data.

Selain itu, pertimbangkan untuk tidak memiliki panggilan API klien sama sekali. cukup buat sisi server HTML. Meskipun kerangka kerja aplikasi satu halaman javascript mendorong Anda ke rute api. Ini biasanya bukan pendekatan yang optimal untuk situs e-commerce volume tinggi.

masukkan deskripsi gambar di sini

Ewan
sumber
Terima kasih, Sebenarnya Api ini digunakan di aplikasi android dan telepon, saya ingin tahu kapan halaman beranda aplikasi dimuat jika saya mendapatkan semua sumber daya seperti: slider, merek, produk dalam satu panggilan api atau membuat panggilan individual ke api untuk sumber daya individual ketika pengguna gulir ke bawah?
shaijut
Logika yang sama berlaku, meminimalkan panggilan simultan di mana tidak diperlukan. Sebuah aplikasi memberi Anda sedikit lebih banyak fleksibilitas untuk mengunduh info di latar belakang. Anda mungkin ingin beralih ke pendekatan (tanggal) GetChangesSInce
Ewan
Jadi Anda berkesimpulan, yang terbaik adalah memiliki API tunggal untuk meminta semua respons sumber daya laman beranda sekaligus ketika laman beranda App memuat dan memiliki api yang berbeda untuk bilah geser, merek, dll secara terpisah untuk layanan mikro ketika Anda memiliki bagian halaman yang akan diperbarui ?
shaijut
tidak kecuali Anda memiliki alasan yang bagus mengapa bagian-bagian itu tidak hanya dimuat dengan halaman / data utama
Ewan
Saya memiliki pertanyaan terakhir bagaimana aplikasi seperti amazon, flipkart berfungsi? Apakah mereka tidak memuat semua sumber daya laman beranda dengan satu panggilan saat pengguna membuka aplikasi? Saya ingin tahu apa pendekatan terbaik untuk ini.
shaijut
5

TL; DR: Di samping semua pertimbangan aplikasi lain, melakukan satu panggilan akan lebih cepat daripada melakukan beberapa panggilan. Menjalankan panggilan secara tidak sinkron dapat mengurangi waktu keseluruhan yang diperlukan untuk menyelesaikan operasi yang diberikan dari perspektif pengguna Anda (yang mungkin merupakan semua yang Anda butuhkan), tetapi secara agregat, waktu yang dibutuhkan masih lebih lama untuk beberapa panggilan.

Namun dalam kasus Anda, saya tidak yakin itu cerita lengkapnya.

API REST adalah istilah yang agak ambigu, karena berbagai interpretasi dari makalah yang membuat ide populer. Namun, bahkan oleh penafsiran paling liberal tentang apa yang merupakan API REST, apa yang Anda miliki tidak begitu cocok.

Prinsip intinya adalah bahwa Anda memiliki sumber daya di mana Anda ingin melakukan suatu tindakan. URI mengidentifikasi sumber daya yang Anda minati, dan Anda biasanya akan menggunakan kata kerja HTTP untuk menunjukkan apa yang ingin Anda lakukan terhadap sumber daya itu.

Dalam kasus spesifik Anda, semua metode Anda memiliki kata 'get' dalam nama mereka. Anda harus mengubah kata kerja yang digunakan dalam permintaan HTTP untuk menunjukkan bahwa Anda ingin 'mendapatkan' sumber daya yang tersedia di lokasi itu.

Skema URI Anda harus mewakili hierarki logis dari sumber daya yang ingin Anda sediakan bagi pengguna API Anda, jadi dalam kasus Anda saya akan mempertimbangkan menggunakan sesuatu seperti /api/products?category=slidersuntuk menyaring koleksi produk Anda. Ini berarti bahwa ketika klien ingin mendapatkan semua produk Anda, mereka dapat dengan mudah menghilangkan string kueri.

richzilla
sumber
Terima kasih, jadi maksud Anda tunggal urluntuk API tetapi meminta sumber daya yang berbeda dibuat menggunakan String Kueri? , periksa juga ini .
shaijut
Ya, menjalankan panggilan secara tidak sinkron akan mengurangi waktu absolut yang diperlukan untuk mengambil data, tetapi secara agregat, waktu yang diambil masih akan lebih besar; Lebih banyak panggilan harus mengulang overhead koneksi TCP, dan komunikasi pulang pergi. Bahkan menggunakan fitur seperti keep-alivearent akan menghapus ini sepenuhnya.
richzilla
Kategori akan menjadi properti dari sumber daya produk individual. Secara logis Anda akan mengambil koleksi produk dan memfilter semua produk dengan kategori yang ditentukan
richzilla
Jadi maksud Anda, ketika pengguna membuka beranda aplikasi, satu panggilan harus pergi ke api yang mengembalikan semua sumber daya yang disebutkan di atas? atau ketika dia melakukan panggilan individu harus dilakukan untuk sumber daya tertentu yang merupakan praktik terbaik?
shaijut
Itu tergantung pada apa yang diharapkan oleh pengguna Anda di setiap titik dalam aplikasi Anda. Ambil situs web ini sebagai contoh, ketika Anda mengklik pada questionsAnda melihat URI adalah /questions, ketika Anda mengklik pada salah satu tag favorit Anda, URI adalah/questions/tagged/<tagname>
richzilla