Son zamanlarda bu ve diğer REST sayfalama ile ilgili soruları araştırıyorum ve bulgularımın bazılarını buraya eklemenin yapıcı olduğunu düşündüm. Soruyu, sayfalar hakkındaki düşünceleri ve sayımları yakından ilişkili oldukları için içerecek şekilde biraz genişletiyorum.
Başlıkları
Disk belleği meta verileri yanıta yanıt başlıkları biçiminde eklenir. Bu yaklaşımın en büyük yararı, yanıt yükünün kendisinin sadece istediği gerçek veri olmasıdır. Çağrı bilgisiyle ilgilenmeyen müşteriler için yanıtın işlenmesini kolaylaştırmak.
Toplam sayı da dahil olmak üzere, disk belleği ile ilgili bilgileri döndürmek için vahşi ortamda kullanılan bir grup (standart ve özel) başlık vardır.
X Toplam-Count
X-Total-Count: 234
Bu, vahşi doğada bulduğum bazı API'larda kullanılıyor . Bu başlığa örneğin Loopback'e destek eklemek için NPM paketleri de vardır . Bazı makaleler bu başlığın da ayarlanmasını önermektedir.
Genellikle Link
sayfalama için oldukça iyi bir çözüm olan başlık ile birlikte kullanılır , ancak toplam sayım bilgisinden yoksundur.
bağlantı
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
Ben genel bir konsensüs kullanmak olduğunu, bu konuda bir çok okumaktan, hissetmek Link
başlığını kullanan müşterilerine ait bağlantıları çağrı sağlamak için rel=next
, rel=previous
bu vb sorunu olan kaç tane toplam kayıtların bilgi yoksun olduğunu neden birçok API bunu X-Total-Count
başlık ile birleştirir .
Alternatif olarak, bazı API'ler ve örneğin JsonApi standardı Link
biçimi kullanır , ancak üstbilgi yerine bilgileri yanıt zarfına ekler. Bu, meta verilere erişimi basitleştirir (ve toplam sayım bilgisini eklemek için bir yer oluşturur), gerçek verilere erişimin karmaşıklığını arttırmak pahasına (bir zarf ekleyerek).
İçerik Menzilli
Content-Range: items 0-49/234
Aralık başlığı adlı bir blog makalesi tarafından tanıtılan , sizi seçin (sayfalandırma için)! . Yazar, kullanımı için güçlü bir durum Range
ve Content-Range
sayfalama için üstbilgileri yapar. Bu başlıklarda RFC'yi dikkatle okuduğumuzda , anlamlarını bayt aralıklarının ötesine genişletmenin aslında RFC tarafından beklendiğini ve açıkça izin verildiğini görüyoruz. Bunun yerine bağlam bağlamında kullanıldığında , Aralık başlığı bize hem belirli bir öğe aralığı istemek hem de yanıt öğelerinin toplam sonuç aralığının hangi aralıklarla ilgili olduğunu belirtmek için bir yol sunar. Bu başlık ayrıca toplam sayıyı göstermek için harika bir yol sunar. Ve çoğunlukla bire bir sayfalamayı eşleştiren gerçek bir standarttır. Ayrıca vahşi doğada kullanılır .items
bytes
Zarf
En sevdiğimiz Soru-Cevap web sitemiz dahil birçok API, veriler hakkında meta bilgi eklemek için kullanılan verilerin etrafında bir zarf , bir sargı kullanır . Ayrıca, OData ve JsonApi standartları hem bir yanıt zarf kullanın.
Bunun (imho) en büyük dezavantajı, gerçek verilerin zarf içinde bir yerde bulunması gerektiğinden yanıt verilerinin işlenmesinin daha karmaşık hale gelmesidir. Ayrıca bu zarf için birçok farklı format vardır ve doğru olanı kullanmanız gerekir. OData ve JsonApi'nin yanıt zarflarının çılgınca farklı olduğunu ve yanıtta birden fazla noktada meta verilerde OData'nın karıştırıldığını söylüyor.
Ayrı uç nokta
Bunun diğer cevaplarda yeterince ele alındığını düşünüyorum. Bunu çok araştırmadım çünkü şu anda birden fazla uç noktaya sahip olduğunuz için bunun kafa karıştırıcı olduğu yorumlarına katılıyorum. Her son noktanın bir (kaynakları) kaynak (temsil) temsil etmesi en iyisi olduğunu düşünüyorum.
Diğer düşünceler
Yalnızca yanıtla ilgili disk belleği meta bilgilerini iletmek zorunda değiliz, aynı zamanda istemcinin belirli sayfaları / aralıkları istemesine de izin veririz. Tutarlı bir çözüm elde etmek için bu yönüne bakmak ilginçtir. Burada da üstbilgileri ( Range
üstbilgi çok uygun görünüyor) veya sorgu parametreleri gibi diğer mekanizmaları kullanabiliriz. Bazı insanlar bazı kullanım durumlarında mantıklı olabilir ayrı kaynaklar (örn olarak sonuçların sayfalarını tedavi savunuyorlar /books/231/pages/52
ben gibi sık kullanılan isteği parametrelerinden vahşi aralığını seçerek sona erdi. pagesize
, page[size]
Ve limit
vb destekleyen ek olarak Range
başlık (ve istek parametresi olarak de).