Saya tertarik untuk mengekspos antarmuka REST langsung ke koleksi dokumen JSON (pikirkan CouchDB atau Persevere ). Masalah yang saya hadapi adalah bagaimana menangani GET
operasi pada root collection jika koleksinya besar.
Sebagai contoh, anggap saya sedang mengekspos Questions
tabel StackOverflow di mana setiap baris diekspos sebagai dokumen (bukan berarti ada tabel seperti itu, hanya contoh konkret dari kumpulan 'dokumen' yang cukup besar). Koleksi akan tersedia di /db/questions
dengan biasa CRUD api GET /db/questions/XXX
, PUT /db/questions/XXX
, POST /db/questions
adalah dalam bermain. Cara standar untuk mendapatkan seluruh koleksi adalah dengan GET /db/questions
tetapi jika itu secara naif membuang setiap baris sebagai objek JSON, Anda akan mendapatkan unduhan yang cukup besar dan banyak pekerjaan di bagian server.
Solusinya, tentu saja, paging. Dojo telah memecahkan masalah ini di JsonRestStore - nya melalui ekstensi pintar yang sesuai dengan RFC2616 menggunakan Range
header dengan unit jangkauan khusus items
. Hasilnya adalah 206 Partial Content
yang hanya mengembalikan kisaran yang diminta. Keuntungan dari pendekatan ini dibandingkan parameter kueri adalah ia meninggalkan string kueri untuk ... kueri (misalnya GET /db/questions/?score>200
atau semacamnya, dan ya yang akan dikodekan %3E
).
Pendekatan ini sepenuhnya mencakup perilaku yang saya inginkan. Masalahnya adalah bahwa RFC 2616 menetapkan bahwa pada respons 206 (penekanan saya):
The permintaan HARUS menyertakan Rentang sundulan lapangan ( bagian 14,35 ) menunjukkan kisaran yang diinginkan, dan MUNGKIN telah menyertakan header bidang Jika-Range ( bagian 14.27 ) untuk membuat permintaan bersyarat.
Ini masuk akal dalam konteks penggunaan standar tajuk tetapi menjadi masalah karena saya ingin respons 206 menjadi default untuk menangani klien naif / penjelajahan acak.
Saya telah membahas RFC secara mendetail mencari solusi tetapi tidak senang dengan solusi saya dan saya tertarik dengan SO yang menangani masalah tersebut.
Ide yang saya miliki:
- Kembali
200
denganContent-Range
tajuk! - Saya tidak berpikir bahwa ini salah, tetapi saya lebih suka jika indikator yang lebih jelas bahwa responsnya hanya Konten Sebagian. - Kembali
400 Range Required
- Tidak ada kode respons 400 khusus untuk header yang diperlukan, jadi kesalahan default harus digunakan dan dibaca secara manual. Hal ini juga membuat eksplorasi melalui browser web (atau klien lain seperti Resty) lebih sulit. - Gunakan parameter kueri - Pendekatan standar, tetapi saya berharap untuk mengizinkan kueri ala Persevere dan ini memotong ruang nama kueri.
- Kembali saja
206
! - Saya pikir sebagian besar klien tidak akan panik, tetapi saya lebih suka tidak melawan HARUS di RFC - Perluas spesifikasi! Return
266 Partial Content
- Berperilaku persis seperti 206 tetapi sebagai respons atas permintaan yang HARUS TIDAK berisiRange
header. Saya pikir 266 cukup tinggi sehingga saya tidak akan mengalami masalah tabrakan dan itu masuk akal bagi saya, tetapi saya tidak jelas apakah ini dianggap tabu atau tidak.
Menurut saya ini adalah masalah yang cukup umum dan saya ingin melihat ini dilakukan secara de facto sehingga saya atau orang lain tidak menciptakan kembali kemudi.
Bagaimana cara terbaik untuk mengekspos koleksi lengkap melalui HTTP jika koleksinya besar?