Saya telah melakukan beberapa penelitian ekstensif tentang ini dan pertanyaan terkait halaman REST lainnya akhir-akhir ini dan berpikir itu konstruktif untuk menambahkan beberapa temuan saya di sini. Saya memperluas pertanyaan sedikit untuk memasukkan pemikiran tentang paging serta hitungan yang terkait erat.
Header
Metadata halaman disertakan dalam tanggapan dalam bentuk header tanggapan. Manfaat besar dari pendekatan ini adalah bahwa payload respons itu sendiri hanyalah permintaan data sebenarnya yang diminta. Membuat pemrosesan respons lebih mudah untuk klien yang tidak tertarik dengan informasi halaman.
Ada banyak header (standar dan kustom) yang digunakan di alam liar untuk mengembalikan informasi terkait halaman, termasuk jumlah total.
X-Jumlah-Hitung
X-Total-Count: 234
Ini digunakan di beberapa API yang saya temukan di alam liar. Ada juga paket NPM untuk menambahkan dukungan untuk header ini, misalnya Loopback. Beberapa artikel merekomendasikan pengaturan tajuk ini juga.
Ini sering digunakan dalam kombinasi dengan Link
tajuk, yang merupakan solusi yang cukup bagus untuk halaman, tetapi kekurangan informasi jumlah total.
Tautan
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
Saya merasa, dari banyak membaca tentang subjek ini, bahwa konsensus umum adalah menggunakan Link
tajuk untuk menyediakan tautan paging ke klien yang menggunakan rel=next
, rel=previous
dll. Masalahnya adalah kurangnya informasi tentang berapa banyak total catatan yang ada, yaitu mengapa banyak API menggabungkan ini dengan X-Total-Count
tajuk.
Sebagai alternatif, beberapa API dan misalnya standar JsonApi , menggunakan Link
format tersebut, tetapi menambahkan informasi dalam amplop tanggapan alih-alih ke header. Ini menyederhanakan akses ke metadata (dan menciptakan tempat untuk menambahkan informasi jumlah total) dengan mengorbankan kerumitan pengaksesan data aktual itu sendiri (dengan menambahkan amplop).
Rentang Konten
Content-Range: items 0-49/234
Dipromosikan oleh artikel blog bernama Range header, saya memilih Anda (untuk pagination)! . Penulis membuat alasan kuat untuk menggunakan Range
dan Content-Range
header untuk penomoran halaman. Ketika kita hati-hati membaca yang RFC pada header ini, kami menemukan bahwa memperluas maknanya luar rentang byte sebenarnya diantisipasi oleh RFC dan secara eksplisit diperbolehkan. Saat digunakan dalam konteks items
alih - alih bytes
, header Rentang sebenarnya memberi kita cara untuk meminta rentang item tertentu dan menunjukkan kisaran hasil total yang terkait dengan item respons. Header ini juga memberikan cara yang bagus untuk menampilkan jumlah total. Dan itu adalah standar sejati yang sebagian besar memetakan satu-ke-satu ke paging. Itu juga digunakan di alam liar .
Amplop
Banyak API, termasuk yang dari situs web Tanya Jawab favorit kami menggunakan amplop , pembungkus di sekitar data yang digunakan untuk menambahkan informasi meta tentang data. Juga, standar OData dan JsonApi keduanya menggunakan amplop tanggapan.
Kelemahan besar dari ini (imho) adalah bahwa pemrosesan data respons menjadi lebih kompleks karena data aktual harus ditemukan di suatu tempat di dalam amplop. Juga ada banyak format berbeda untuk amplop itu dan Anda harus menggunakan yang benar. Dikatakan bahwa amplop respons dari OData dan JsonApi sangat berbeda, dengan OData mencampurkan metadata di beberapa titik dalam respons.
Pisahkan titik akhir
Saya pikir ini sudah cukup tercakup dalam jawaban lain. Saya tidak menyelidiki sebanyak ini karena saya setuju dengan komentar yang membingungkan karena Anda sekarang memiliki beberapa jenis titik akhir. Saya pikir paling baik jika setiap titik akhir mewakili (kumpulan) sumber daya.
Pikiran lebih lanjut
Kami tidak hanya harus mengkomunikasikan informasi meta halaman yang terkait dengan respons, tetapi juga mengizinkan klien untuk meminta halaman / rentang tertentu. Menarik juga untuk melihat aspek ini untuk mendapatkan solusi yang koheren. Di sini juga kita dapat menggunakan header ( Range
header tampaknya sangat cocok), atau mekanisme lain seperti parameter kueri. Beberapa orang menganjurkan memperlakukan halaman hasil sebagai sumber daya terpisah, yang mungkin masuk akal dalam beberapa kasus penggunaan (mis /books/231/pages/52
. Saya akhirnya memilih kisaran liar parameter permintaan yang sering digunakan seperti pagesize
, page[size]
dan limit
lain - lain selain mendukung Range
header (dan sebagai parameter permintaan demikian juga).