Kaynak listesi döndüren REST API'leri oluştururken, büyük veri kümelerini nasıl yöneteceğinizi düşünmek çok önemlidir. Binlerce, hatta milyonlarca kaydı tek bir API yanıtında döndürmek pratik değildir ve önemli performans sorunlarına, hem sunucu hem de istemci için yüksek bellek tüketimine ve kötü bir kullanıcı deneyimine yol açabilir. Sayfalama, bu soruna standart bir çözümdür. Büyük bir veri kümesini, daha sonra sırayla sunulan "sayfalar" adı verilen daha küçük, yönetilebilir parçalara ayırmayı içerir. Bu eğitim, REST API'lerinizde çeşitli sayfalama stratejilerini uygulamanın teknik adımları boyunca size rehberlik edecektir.
Geliştirici Ekibinizin maksimum verimlilikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?
Apidog tüm taleplerinizi karşılıyor ve Postman'in yerini çok daha uygun bir fiyata alıyor!
Sayfalamanın Neden Önemli Olduğu?
Uygulama detaylarına girmeden önce, sayfalama özelliğinin, kaynak koleksiyonlarıyla ilgilenen API'ler için neden vazgeçilmez bir özellik olduğuna kısaca değinelim:
- Performans: Büyük miktarda veri istemek ve aktarmak yavaş olabilir. Sayfalama, her isteğin yük boyutunu azaltır, bu da daha hızlı yanıt sürelerine ve azaltılmış sunucu yüküne yol açar.
- Kaynak Tüketimi: Daha küçük yanıtlar, onları oluşturan sunucuda ve onları ayrıştıran istemcide daha az bellek tüketir. Bu, özellikle mobil istemciler veya sınırlı kaynaklara sahip ortamlar için kritiktir.
- Hız Sınırlaması ve Kotalar: Birçok API hız sınırları uygular. Sayfalama, istemcilerin verileri bir kerede almaya çalışmak yerine, zaman içinde daha küçük parçalar halinde getirerek bu sınırlamalar dahilinde kalmasına yardımcı olur.
- Kullanıcı Deneyimi: API'yi tüketen kullanıcı arayüzleri için, verileri sayfalarda sunmak, kullanıcıları çok büyük bir liste veya çok uzun bir kaydırma ile bunaltmaktan çok daha kullanıcı dostudur.
- Veritabanı Verimliliği: Verilerin bir alt kümesini getirmek, özellikle uygun dizinleme yapılmışsa, genellikle tüm bir tabloyu almakla karşılaştırıldığında veritabanı üzerinde daha az yük oluşturur.
Yaygın Sayfalama Stratejileri
Sayfalamayı uygulamak için çeşitli yaygın stratejiler vardır ve her birinin kendine özgü avantaj ve dezavantajları vardır. En popüler olanları keşfedeceğiz: ofset/limit (genellikle sayfa tabanlı olarak anılır) ve imleç tabanlı (keyset veya arama sayfalama olarak da bilinir).
1. Ofset/Limit (veya Sayfa Tabanlı) Sayfalama
Bu, tartışmasız en basit ve en yaygın olarak benimsenen sayfalama yöntemidir. İstemcinin iki ana parametre belirtmesine izin vererek çalışır:
offset
: Veri kümesinin başından atlanacak kayıt sayısı.limit
: Tek bir sayfada döndürülecek maksimum kayıt sayısı.
Alternatif olarak, istemciler şunları belirtebilir:
page
: Almak istedikleri sayfa numarası.pageSize
(veyaper_page
,limit
): Sayfa başına kayıt sayısı.
offset
, page
ve pageSize
'den şu formülle hesaplanabilir: offset = (page - 1) * pageSize
.
Teknik Uygulama Adımları:
/items
adlı bir API uç noktamız olduğunu ve bu uç noktanın bir öğe listesi döndürdüğünü varsayalım.
a. API İstek Parametreleri:
İstemci şu şekilde bir istekte bulunur:GET /items?offset=20&limit=10
(ilk 20'yi atlayarak 10 öğe getir)
veyaGET /items?page=3&pageSize=10
(sayfa başına 10 öğe ile 3. sayfayı getir, bu da offset=20, limit=10'a eşdeğerdir).
İstemci bunları sağlamazsa, bu parametreler için varsayılan değerler ayarlamak iyi bir uygulamadır (örneğin, limit=20
, offset=0
veya page=1
, pageSize=20
). Ayrıca, istemcilerin aşırı sayıda kayıt talep etmesini önlemek için maksimum bir limit
veya pageSize
uygulayın; bu, sunucuyu zorlayabilir.
b. Arka Uç Mantığı (Kavramsal):
Sunucu bu isteği aldığında, bu parametreleri bir veritabanı sorgusuna çevirmesi gerekir.
// Spring Boot ile Java'da örnek
@GetMapping("/items")
public ResponseEntity<PaginatedResponse<Item>> getItems(
@RequestParam(defaultValue = "0") int offset,
@RequestParam(defaultValue = "20") int limit
) {
// Kötüye kullanımı önlemek için limiti doğrulayın
if (limit > 100) {
limit = 100; // Maksimum limiti uygula
}
List<Item> items = itemRepository.findItemsWithOffsetLimit(offset, limit);
long totalItems = itemRepository.countTotalItems(); // Meta veri için
// Sayfalı yanıtı oluşturun ve döndürün
// ...
}
c. Veritabanı Sorgusu (SQL Örneği):
Çoğu ilişkisel veritabanı, ofset ve limit ifadelerini doğrudan destekler.
PostgreSQL veya MySQL için:
SELECT *
FROM items
ORDER BY created_at DESC -- Tutarlı sıralama, kararlı sayfalama için çok önemlidir
LIMIT 10 -- Bu 'limit' parametresidir
OFFSET 20; -- Bu 'offset' parametresidir
SQL Server için (eski sürümler ROW_NUMBER()
kullanabilir):
SELECT *
FROM items
ORDER BY created_at DESC
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;
Oracle için:
SELECT *
FROM (
SELECT i.*, ROWNUM rnum
FROM (
SELECT *
FROM items
ORDER BY created_at DESC
) i
WHERE ROWNUM <= 20 + 10 -- offset + limit
)
WHERE rnum > 20; -- offset
Sıralama Üzerine Önemli Not: Ofset/limit sayfalama yönteminin güvenilir olması için, temel veri kümesi, tutarlı ve benzersiz (veya neredeyse benzersiz) bir anahtara veya anahtarların bir kombinasyonuna göre sıralanmalıdır. Öğelerin sırası istekler arasında değişebiliyorsa (örneğin, yeni öğeler ekleniyorsa veya öğeler sıralama düzenini etkileyecek şekilde güncelleniyorsa), kullanıcılar sayfaları gezinirken yinelenen öğeler görebilir veya öğeleri kaçırabilir. Yaygın bir seçim, oluşturma zaman damgası veya birincil kimliğe göre sıralamaktır.
d. API Yanıt Yapısı:
İyi bir sayfalama yanıtı, yalnızca geçerli sayfanın verilerini değil, aynı zamanda istemcinin gezinmesine yardımcı olacak meta verileri de içermelidir.
{
"data": [
// geçerli sayfa için öğe dizisi
{ "id": "item_21", "name": "Item 21", ... },
{ "id": "item_22", "name": "Item 22", ... },
// ... 'limit' öğesine kadar
{ "id": "item_30", "name": "Item 30", ... }
],
"pagination": {
"offset": 20,
"limit": 10,
"totalItems": 5000, // Mevcut toplam öğe sayısı
"totalPages": 500, // ceil(totalItems / limit) olarak hesaplanır
"currentPage": 3 // (offset / limit) + 1 olarak hesaplanır
},
"links": { // Gezinme için HATEOAS bağlantıları
"self": "/items?offset=20&limit=10",
"first": "/items?offset=0&limit=10",
"prev": "/items?offset=10&limit=10", // İlk sayfadaysa Null
"next": "/items?offset=30&limit=10", // Son sayfadaysa Null
"last": "/items?offset=4990&limit=10"
}
}
HATEOAS (Uygulama Durumunun Motoru Olarak Hipermedya) bağlantıları (self
, first
, prev
, next
, last
) sağlamak, bir REST en iyi uygulamasıdır. İstemcilerin URL'leri kendilerinin oluşturmak zorunda kalmadan sayfalar arasında gezinmelerine olanak tanır.
Ofset/Limit Sayfalamanın Artıları:
- Basitlik: Anlaşılması ve uygulanması kolaydır.
- Durumsal Gezinme: Herhangi bir belirli sayfaya doğrudan gezinmeye izin verir (örneğin, "50. sayfaya atla").
- Yaygın Olarak Desteklenir:
OFFSET
veLIMIT
için veritabanı desteği yaygındır.
Ofset/Limit Sayfalamanın Eksileri:
- Büyük Ofsetlerle Performans Düşüşü:
offset
değeri arttıkça, veritabanları yavaşlayabilir. Veritabanı genellikleoffset + limit
satırlarının tümünü taramak zorunda kalır, daha sonraoffset
satırlarını atar. Bu, derin sayfalar için verimsiz olabilir. - Veri Kayması/Kaçırılan Öğeler: Bir kullanıcı sayfalama yaparken veri kümesine yeni öğeler eklenir veya mevcut öğeler kaldırılırsa, veri "penceresi" kayabilir. Bu, bir kullanıcının aynı öğeyi iki farklı sayfada görmesine veya bir öğeyi tamamen kaçırmasına neden olabilir. Bu, sık sık güncellenen veri kümelerinde özellikle sorunludur. Örneğin, 2. sayfadaysanız (11-20. öğeler) ve listenin başına yeni bir öğe eklenirse, 3. sayfayı istediğinizde, daha önce 21. öğe olan artık 22. öğedir. Tam zamanlamaya ve silme desenlerine bağlı olarak yeni 21. öğeyi kaçırabilir veya yinelenenleri görebilirsiniz.
2. İmleç Tabanlı (Keyset/Arama) Sayfalaması
İmleç tabanlı sayfalama, ofset/limit'in bazı eksikliklerini, özellikle büyük veri kümeleriyle performansı ve veri tutarlılığı sorunlarını ele alır. Mutlak bir ofsete güvenmek yerine, veri kümesindeki belirli bir öğeye işaret eden bir "imleç" kullanır. Daha sonra istemci, bu imlecin "sonrasındaki" veya "öncesindeki" öğeleri ister.
İmleç tipik olarak, önceki sayfada alınan son öğenin sıralama anahtar(lar)ının değer(ler)ini kodlayan opak bir dizedir.
Teknik Uygulama Adımları:
a. API İstek Parametreleri:
İstemci şu şekilde bir istekte bulunur:GET /items?limit=10
(ilk sayfa için)
Ve sonraki sayfalar için:GET /items?limit=10&after_cursor=opaquestringrepresentinglastitemid
Veya, geriye doğru sayfalama yapmak için (daha az yaygın ancak mümkün):GET /items?limit=10&before_cursor=opaquestringrepresentingfirstitemid
limit
parametresi hala sayfa boyutunu tanımlar.
b. İmleç Nedir?
Bir imleç şunlar olmalıdır:
- İstemciye opak: İstemcinin iç yapısını anlaması gerekmez. Sadece bir yanıttan alır ve sonraki istekte geri gönderir.
- Benzersiz ve sıralı sütun(lar)a dayalı: Tipik olarak, bu birincil kimliktir (UUIDv1 veya bir veritabanı dizisi gibi sıralıysa) veya bir zaman damgası sütunudur. Tek bir sütun yeterince benzersiz değilse (örneğin, birden fazla öğe aynı zaman damgasına sahip olabilir), sütunların bir kombinasyonu kullanılır (örneğin,
timestamp
+id
). - Kodlanabilir ve Kod Çözülebilir: Genellikle URL güvenli olduğundan emin olmak için Base64 ile kodlanır. Kimliğin kendisi kadar basit olabilir veya daha sonra Base64 ile kodlanan bir JSON nesnesi
{ "last_id": 123, "last_timestamp": "2023-10-27T10:00:00Z" }
olabilir.
c. Arka Uç Mantığı (Kavramsal):
// Spring Boot ile Java'da örnek
@GetMapping("/items")
public ResponseEntity<CursorPaginatedResponse<Item>> getItems(
@RequestParam(defaultValue = "20") int limit,
@RequestParam(required = false) String afterCursor
) {
// Limiti doğrulayın
if (limit > 100) {
limit = 100;
}
// İmlecin kodunu çözerek son görülen öğenin özelliklerini alın
// örneğin, LastSeenItemDetails lastSeen = decodeCursor(afterCursor);
// afterCursor null ise, bu ilk sayfadır.
List<Item> items;
if (afterCursor != null) {
DecodedCursor decoded = decodeCursor(afterCursor); // örneğin, { lastId: "some_uuid", lastCreatedAt: "timestamp" }
items = itemRepository.findItemsAfter(decoded.getLastCreatedAt(), decoded.getLastId(), limit);
} else {
items = itemRepository.findFirstPage(limit);
}
String nextCursor = null;
if (!items.isEmpty() && items.size() == limit) {
// Öğelerin sıralandığı varsayılarak, sonraki imleci oluşturmak için listedeki son öğe kullanılır
Item lastItemOnPage = items.get(items.size() - 1);
nextCursor = encodeCursor(lastItemOnPage.getCreatedAt(), lastItemOnPage.getId());
}
// İmleç sayfalı yanıtı oluşturun ve döndürün
// ...
}
// İmleçleri kodlamak/kodunu çözmek için yardımcı yöntemler
// private DecodedCursor decodeCursor(String cursor) { ... }
// private String encodeCursor(Timestamp createdAt, String id) { ... }
d. Veritabanı Sorgusu (SQL Örneği):
Anahtar, imleçten sıralama anahtarlarına göre kayıtları filtreleyen bir WHERE
yan tümcesi kullanmaktır. ORDER BY
yan tümcesi, imlecin bileşimiyle uyumlu olmalıdır.
created_at
'e (azalan) ve ardından id
'ye (azalan) göre sıralama yapıldığını varsayarsak, created_at
benzersiz değilse kararlı sıralama için bir bağ kırıcı olarak:
İlk sayfa için:
SELECT *
FROM items
ORDER BY created_at DESC, id DESC
LIMIT 10;
Sonraki sayfalar için, imleç last_created_at_from_cursor
ve last_id_from_cursor
olarak kodunu çözdüyse:
SELECT *
FROM items
WHERE (created_at, id) < (CAST('last_created_at_from_cursor' AS TIMESTAMP), CAST('last_id_from_cursor' AS UUID)) -- Veya uygun türler
-- Artan sıralama için, > olurdu
-- Demet karşılaştırması (created_at, id) < (val1, val2) yazmanın öz bir yoludur:
-- WHERE created_at < 'last_created_at_from_cursor'
-- OR (created_at = 'last_created_at_from_cursor' AND id < 'last_id_from_cursor')
ORDER BY created_at DESC, id DESC
LIMIT 10;
Bu tür bir sorgu, özellikle (created_at, id)
üzerinde bir dizin varsa çok verimlidir. Veritabanı, alakasız satırları taramadan doğrudan başlangıç noktasına "arama" yapabilir.
e. API Yanıt Yapısı:
{
"data": [
// geçerli sayfa için öğe dizisi
{ "id": "item_N", "createdAt": "2023-10-27T10:05:00Z", ... },
// ... 'limit' öğesine kadar
{ "id": "item_M", "createdAt": "2023-10-27T10:00:00Z", ... }
],
"pagination": {
"limit": 10,
"hasNextPage": true, // daha fazla veri olup olmadığını gösteren boole değeri
"nextCursor": "base64encodedcursorstringforitem_M" // opak dize
// İki yönlü imleçler destekleniyorsa, potansiyel olarak bir "prevCursor"
},
"links": {
"self": "/items?limit=10&after_cursor=current_request_cursor_if_any",
"next": "/items?limit=10&after_cursor=base64encodedcursorstringforitem_M" // Sonraki sayfa yoksa Null
}
}
İmleç tabanlı sayfalama, genellikle totalPages
veya totalItems
sağlamaz, çünkü bunları hesaplamak tam bir tablo taraması gerektirir ve bu da bazı performans avantajlarını geçersiz kılar. Bunlara kesin olarak ihtiyaç duyuluyorsa, ayrı bir uç nokta veya bir tahmin sağlanabilir.
İmleç Tabanlı Sayfalamanın Artıları:
- Büyük Veri Kümelerinde Performans: Veritabanı, dizinleri kullanarak imlecin konumuna verimli bir şekilde arama yapabildiğinden, genellikle derin sayfalama için ofset/limitten daha iyi performans gösterir.
- Dinamik Veri Kümelerinde Kararlı: Veriler sık sık eklenip çıkarıldığında, imleç belirli bir öğeye demirlendiğinden, kaçırılan veya yinelenen öğelere karşı daha az duyarlıdır. İmleçten önceki bir öğe silinirse, sonraki öğeleri etkilemez.
- Sonsuz Kaydırma İçin Uygun: "Sonraki sayfa" modeli, sonsuz kaydırma kullanıcı arayüzlerine doğal olarak uyar.
İmleç Tabanlı Sayfalamanın Eksileri:
- "Sayfaya Atla" Yok: Kullanıcılar doğrudan rastgele bir sayfa numarasına (örneğin, "sayfa 5") gidemezler. Gezinme kesinlikle sıralıdır (sonraki/önceki).
- Daha Karmaşık Uygulama: İmleçleri tanımlamak ve yönetmek, özellikle birden fazla sıralama sütunu veya karmaşık sıralama düzenleri ile daha karmaşık olabilir.
- Sıralama Sınırlamaları: Sıralama düzeni sabit olmalı ve imleç için kullanılan sütunlara dayalı olmalıdır. İmleçlerle sıralama düzenini anında değiştirmek karmaşıktır.
Doğru Stratejiyi Seçmek
Ofset/limit ve imleç tabanlı sayfalama arasındaki seçim, özel gereksinimlerinize bağlıdır:
- Ofset/Limit genellikle yeterlidir:
- Veri kümesi nispeten küçükse veya sık sık değişmiyorsa.
- Rastgele sayfalara atlama yeteneği kritik bir özelliktir.
- Uygulama basitliği yüksek bir önceliktir.
- Çok derin sayfalar için performans önemli bir endişe değildir.
- İmleç Tabanlı genellikle tercih edilir:
- Çok büyük, sık değişen veri kümeleriyle uğraşıyorsanız.
- Ölçekte performans ve sayfalama sırasında veri tutarlılığı çok önemlidir.
- Sıralı gezinme (sonsuz kaydırma gibi) birincil kullanım durumudur.
- Toplam sayfa sayılarını görüntülemeniz veya belirli sayfalara atlamaya izin vermeniz gerekmiyorsa.
Bazı sistemlerde, hibrit bir yaklaşım bile kullanılır veya farklı kullanım durumları veya uç noktalar için farklı stratejiler sunulur.
Sayfalamayı Uygulama İçin En İyi Uygulamalar
Seçilen stratejiden bağımsız olarak, bu en iyi uygulamalara uyun:
- Tutarlı Parametre Adlandırması: Sayfalama parametreleriniz için net ve tutarlı adlar kullanın (örneğin,
limit
,offset
,page
,pageSize
,after_cursor
,before_cursor
). API'niz boyunca tek bir kurala uyun (örneğin,camelCase
veyasnake_case
). - Gezinme Bağlantıları Sağlayın (HATEOAS): Yanıt örneklerinde gösterildiği gibi,
self
,next
,prev
,first
velast
(uygun olduğunda) için bağlantılar ekleyin. Bu, API'yi daha keşfedilebilir hale getirir ve istemciyi URL oluşturma mantığından ayırır. - Varsayılan Değerler ve Maksimum Limitler:
- Her zaman
limit
için makul varsayılan değerler ayarlayın (örneğin, 10 veya 25). - İstemcilerin çok fazla veri talep etmesini ve sunucuyu bunaltmasını önlemek için maksimum bir
limit
uygulayın (örneğin, sayfa başına en fazla 100 kayıt). Geçersiz bir değer talep edilirse bir hata döndürün veya limiti sınırlayın.
- Net API Dokümantasyonu: Sayfalama stratejinizi kapsamlı bir şekilde belgeleyin:
- Kullanılan parametreleri açıklayın.
- Örnek istekler ve yanıtlar sağlayın.
- Varsayılan ve maksimum limitleri açıklayın.
- İmleçlerin nasıl kullanıldığını açıklayın (uygunsa), opak olmaları gerekiyorsa iç yapılarını ifşa etmeden.
- Tutarlı Sıralama: Temel verilerin her sayfalama isteği için tutarlı bir şekilde sıralandığından emin olun. Ofset/limit için, bu veri kaymasını önlemek için hayati öneme sahiptir. İmleç tabanlı için, sıralama düzeni imleçlerin nasıl oluşturulduğunu ve yorumlandığını belirler. Birincil sıralama sütununun yinelenen değerlere sahip olabilmesi durumunda benzersiz bir bağ kırıcı sütun (birincil kimlik gibi) kullanın.
- Kenar Durumlarını İşleyin:
- Boş Sonuçlar: Boş bir veri dizisi ve uygun sayfalama meta verileri döndürün (örneğin,
totalItems: 0
veyahasNextPage: false
). - Geçersiz Parametreler: İstemciler geçersiz sayfalama parametreleri sağlarsa (örneğin, negatif limit, tamsayı olmayan sayfa numarası) bir
400 Bad Request
hatası döndürün. - İmleç Bulunamadı (imleç tabanlı için): Sağlanan bir imleç geçersizse veya silinmiş bir öğeye işaret ediyorsa, bir davranışa karar verin: bir
404 Not Found
veya400 Bad Request
döndürün veya zarif bir şekilde ilk sayfaya geri dönün.
- Toplam Sayı Hususları:
- Ofset/limit için,
totalItems
vetotalPages
sağlamak yaygındır.COUNT(*)
'ın çok büyük tablolarda yavaş olabileceğini unutmayın. Bu bir darboğaz haline gelirse, veritabanına özgü optimizasyonları veya tahminleri keşfedin. - İmleç tabanlı için,
totalItems
genellikle performans için atlanır. Gerekirse, tahmini bir sayı veya bunu hesaplayan ayrı bir uç nokta (potansiyel olarak zaman uyumsuz olarak) sağlamayı düşünün.
- Hata İşleme: Hatalar için uygun HTTP durum kodları döndürün (örneğin, kötü girdi için
400
, veri getirme sırasında sunucu hataları için500
). - Güvenlik: Doğrudan bir sayfalama mekanizması olmasa da, sayfalama yapılan verilerin yetkilendirme kurallarına uymasını sağlayın. Bir kullanıcı yalnızca görmesine izin verilen verilerde sayfalama yapabilmelidir.
- Önbelleğe Alma: Sayfalı yanıtlar genellikle önbelleğe alınabilir. Ofset tabanlı sayfalama için,
GET /items?page=2&pageSize=10
oldukça önbelleğe alınabilir. İmleç tabanlı için,GET /items?limit=10&after_cursor=XYZ
de önbelleğe alınabilir. Önbelleğe alma stratejinizin, sayfalama bağlantılarının nasıl oluşturulduğu ve tüketildiği ile iyi çalıştığından emin olun. Temel veriler sık sık değişirse, geçersiz kılma stratejilerinin dikkate alınması gerekir.
Gelişmiş Konular (Kısa Bahisler)
- Sonsuz Kaydırma: İmleç tabanlı sayfalama, sonsuz kaydırma kullanıcı arayüzleri için doğal bir uyum sağlar. İstemci ilk sayfayı getirir ve kullanıcı alta doğru kaydırdıkça, sonraki öğe kümesini getirmek için
nextCursor
'ı kullanır. - Karmaşık Filtreleme ve Sıralama ile Sayfalama: Sayfalamayı dinamik filtreleme ve sıralama parametreleriyle birleştirirken, şunları sağlayın:
- Ofset/limit için:
totalItems
sayısı, filtrelenmiş veri kümesini doğru bir şekilde yansıtır. - İmleç tabanlı için: İmleç, "sonraki"nin ne anlama geldiğini etkiliyorsa, hem sıralama hem de filtrelemenin durumunu kodlar. Bu, imleç tasarımını önemli ölçüde karmaşıklaştırabilir. Genellikle, filtreler veya sıralama düzeni değişirse, sayfalama yeni görünümün "ilk sayfasına" sıfırlanır.
- GraphQL Sayfalaması: GraphQL'in, genellikle "Bağlantılar" olarak adlandırılan, sayfalama işlemini gerçekleştirmenin kendi standartlaştırılmış yolu vardır. Tipik olarak imleç tabanlı sayfalama kullanır ve kenarları (imleçli öğeler) ve sayfa bilgilerini döndürmek için tanımlanmış bir yapıya sahiptir. GraphQL kullanıyorsanız, kurallarına uyun (örneğin, Relay İmleç Bağlantıları spesifikasyonu).
Sonuç
Sayfalamayı doğru bir şekilde uygulamak, ölçeklenebilir ve kullanıcı dostu REST API'leri oluşturmanın temelidir. Ofset/limit sayfalama ile başlamak daha basit olsa da, imleç tabanlı sayfalama, büyük, dinamik veri kümeleri için üstün performans ve tutarlılık sunar. Her stratejinin teknik detaylarını anlayarak, uygulamanızın ihtiyaçlarına en uygun olanı seçerek ve uygulama ve API tasarımı için en iyi uygulamaları izleyerek, API'nizin, ölçekten bağımsız olarak, verileri istemcilerinize verimli bir şekilde iletmesini sağlayabilirsiniz. API tüketicileri için sorunsuz bir deneyim sağlamak için her zaman net dokümantasyona ve sağlam hata işlemeye öncelik vermeyi unutmayın.