REST API'lerinde sayfalandırmayı yönetmek, özellikle bizim gibi bir API sağlayıcısı için API tasarımının çok önemli bir yönüdür. Sayfalandırma, büyük veri kümelerini etkili bir şekilde yönetmemize olanak tanıyarak performansı ve kullanıcı deneyimini geliştirir. Bu blogda, REST API'lerinde sayfalandırmayı yönetmeye yönelik çeşitli teknikleri inceleyeceğiz, bunların avantajlarını ve dezavantajlarını tartışacağız ve pratik örnekler sunacağız.
Sayfalandırma Neden Gereklidir?
Büyük veri kümeleriyle uğraşırken tüm verileri tek bir yanıtta döndürmek verimsiz olabilir ve kaynak yoğun olabilir. Uzun yanıt sürelerine, hem sunucu hem de istemci tarafında yüksek bellek kullanımına ve olası ağ tıkanıklığına neden olabilir. Sayfalandırma, veri kümesini daha küçük, daha yönetilebilir "sayfalara" bölerek ve her seferinde bir sayfa döndürerek bu sorunları çözer.
Yaygın Sayfalandırma Teknikleri
Ofset - Sayfalandırmayı Sınırla
Ofset - limitli sayfalandırma, en basit ve yaygın olarak kullanılan tekniklerden biridir. İki parametrenin belirtilmesini içerir:telafi etmekVesınır.telafi etmekAlınacak verinin başlangıç konumunu belirtir vesınıryanıtta döndürülecek maksimum öğe sayısını belirtir.
Örneğin, bir API uç noktamız varsa/api/ürünlerürünlerin bir listesini döndüren, bir istekofset = 20Vesınır = 1021. ila 30. ürünleri döndürürdü.
Aşağıda ofset - limit sayfalandırmasının uygulanmasına ilişkin bir Python Flask örneği verilmiştir:
from flask import Flask, request, jsonify app = Flask(__name__) ürünler = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', method=['GET']) def get_products(): offset = int(request.args.get('offset', 0)) limit = int(request.args.get('limit', 10)) paginated_products = ürünler[offset:offset + limit] return jsonify(paginated_products) if __name__ == '__main__': app.run(debug=True)
Artıları:
- Anlaşılması ve uygulanması kolaydır.
- Destekleyen veritabanlarıyla iyi çalışır
SINIRVeTELAFİ ETMEKMySQL ve PostgreSQL gibi maddeler.
Eksileri:
- Olarak
telafi etmekdeğer arttıkça performans, özellikle büyük veri kümeleri için önemli ölçüde düşebilir. Bunun nedeni, veritabanının istenen ofsete ulaşmak için çok sayıda satırı atlaması gerekmesidir. - Sayfalandırma sırasında güncellenen verileri işlemek zor olabilir çünkü uzaklık artık doğru konumu gösteremeyebilir.
İmleç Tabanlı Sayfalandırma
İmleç tabanlı sayfalandırma, veri kümesindeki konumu işaretlemek için benzersiz bir tanımlayıcı (imleç) kullanır. İstemci, bir uzaklık belirtmek yerine, sonraki veri sayfasını almak için istekte imleç değerini sağlar.
Örneğin, oluşturulma tarihlerine göre sıralanmış bir kullanıcı listemiz varsa imleç, önceki sayfadaki son kullanıcının oluşturulma tarihi olabilir. Sunucu daha sonra, oluşturma tarihi imleç değerinden daha büyük olan bir sonraki kullanıcı kümesini döndürecektir.
Node.js ve Express'i kullanan basit bir JavaScript örneği:
const express = require('express'); const uygulaması = express(); const kullanıcılar = [ { id: 1, name: 'Kullanıcı 1', created_at: '2023-01-01' }, { id: 2, name: 'Kullanıcı 2', created_at: '2023-01-02' }, // daha fazla kullanıcı... ]; app.get('/api/users', (req, res) => { const imleç = req.query.cursor; const limit = parseInt(req.query.limit) || 10; let startIndex = 0; if (imleç) { startIndex = user.findIndex(user => user.created_at > imleç); } const paginatedUsers = user.slice(startIndex, startIndex + limit); const nextCursor = paginatedUsers.length > 0 ? paginatedUsers[paginatedUsers.length - 1].created_at: null; res.json({ kullanıcılar: paginatedUsers, next_cursor: nextCursor }); app.listen(3000, () => { console.log('Sunucu 3000 numaralı bağlantı noktasında çalışıyor'); });
Artıları:
- Özellikle büyük veri kümeleri için dengeleme - sınır sayfalandırmaya kıyasla daha iyi performans. Veritabanının çok sayıda satırı atlamasına gerek yoktur.
- İmleç her zaman veri kümesinde belirli bir konuma işaret ettiğinden, veri güncellemeleriyle uğraşırken daha sağlamdır.
Eksileri:
- Özellikle birden fazla sıralama kriteriyle uğraşırken uygulanması daha karmaşıktır.
- İmleç olarak kullanılacak benzersiz ve sıralanabilir bir tanımlayıcı gerektirir.
Sayfa Numarası Sayfalandırma
Sayfa numarası sayfalandırması mahsup - sınır sayfalandırmaya benzer, ancak bir mahsup belirtmek yerine istemci belirli bir sayfa numarası ister. Sunucu ofseti sayfa numarasına ve limite göre hesaplar.
Örneğin, eğer sınır sayfa başına 10 öğe ise, 3. sayfaya yönelik bir isteğin ofseti 20 olacaktır (çünküofset = (sayfa_numarası - 1) * sınır).
from flask import Flask, request, jsonify app = Flask(__name__) ürünler = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', method=['GET']) def get_products(): page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) offset = (sayfa - 1) * limit paginated_products = ürünler[offset:offset + limit] return jsonify(paginated_products) if __name__ == '__main__': app.run(debug=True)
Artıları:
- Web sayfalarındaki geleneksel sayfalandırmaya benzer olduğundan kullanıcıların anlaması kolaydır.
- Uygulaması basit.
Eksileri:
- Ofset - sınır sayfalandırmaya benzer şekilde, sayfa sayısı arttıkça performans sorunları yaşanabilir.
- Sayfalandırma sırasında veri güncellemelerini yönetmek zor olabilir.
API Sağlayıcıları için Dikkat Edilmesi Gerekenler
Bir API sağlayıcısı olarak sayfalandırmayı uygularken çeşitli faktörleri dikkate almamız gerekir:
Standardizasyon
Sayfalandırma konusunda endüstri standardı uygulamaları izlemeliyiz. Buna tutarlı parametre adlarının kullanılması da dahildir (örn.telafi etmek,sınır,sayfa,imleç) ve sayfalandırmanın nasıl çalıştığına dair net belgeler sağlamak.


Meta veriler
Sayfalandırılmış verilere ek olarak, yanıtta toplam öğe sayısı, toplam sayfa sayısı ve sonraki ve önceki sayfa bağlantıları gibi meta verileri de sağlamalıyız. Bu, müşterinin veri kümesini daha iyi anlamasına ve sayfalarda gezinmesine yardımcı olur.
Örneğin yanıt aşağıdaki formatta olabilir:
{ "data": [ { "id": 1, "name": "Ürün 1" }, { "id": 2, "name": "Ürün 2" } ], "total_items": 100, "total_pages": 10, "sonraki_sayfa": "/api/products?offset=20&limit=10", "prev_page": null }
Güvenlik
SQL enjeksiyonunu veya diğer güvenlik açıklarını önlemek için sayfalandırma parametrelerinin uygun şekilde doğrulandığından emin olmamız gerekir. Örneğin, şunu dönüştürmeliyiz:telafi etmekVesınırparametreleri tam sayılara ayarlayın ve aşırı kaynak tüketimini önlemek için makul sınırlar belirleyin.
Çözüm
REST API'lerinde sayfalandırmayı yönetmek, API sağlayıcıları için önemli bir beceridir. Veri kümesi boyutuna, performans gereksinimlerine ve kullanıcı deneyimine göre doğru sayfalama tekniğini seçerek daha verimli ve kullanıcı dostu bir API sağlayabiliriz. İster küçük bir veri kümesiyle ister büyük ölçekli bir uygulamayla çalışıyor olun, farklı sayfalandırma yöntemlerinin artılarını ve eksilerini anlamak çok önemlidir.
API'lerimizle ilgileniyorsanız veya sayfalandırma veya API ile ilgili diğer konular hakkında sorularınız varsa, satın alma ve daha fazla tartışma için bizimle iletişime geçmekten çekinmeyin. gibi geniş bir ürün yelpazesi de sunuyoruz.Metokarbamol,Azasetron Hidroklorür, VePirazinamid.
Referanslar
- Richardson, Leonard ve Sam Ruby. RESTful Web Hizmetleri. O'Reilly Medya, 2007.
- Bankalar, Adam. Python ve Flask ile RESTful Web API'leri oluşturma. Packt Yayıncılık, 2018.
