Pri vývoji REST API je dôležité myslieť na škálovanie. Ak vaša služba vracia stovky či tisíce záznamov naraz, klientská aplikácia sa môže rýchlo preťažiť. Stránkovanie (paging), triedenie (sorting) a filtrovanie (filtering) sú kľúčové techniky pre zvýšenie výkonu aj použiteľnosti. V tomto článku sa pozrieme, ako ich implementovať v Java REST službách s využitím JPA a Hibernate.
Stránkovanie znamená, že údaje vraciate po častiach – napríklad 10 alebo 20 záznamov na jednu odpoveď. Toto umožňuje:
Najčastejšie používané parametre:
?offset=0&limit=20
Prvý parameter označuje index prvého záznamu (od ktorého sa začína), druhý určuje počet záznamov na stránku. Alternatívne sa používa stránkovanie pomocou page a size.
REST API by malo umožniť klientovi rozhodnúť, ako chce dáta zobraziť. Príklad URL požiadavky:
/api/products?offset=0&limit=10&sortBy=price&order=asc&filter=category:electronics
Parametre by mali byť flexibilné, ale zároveň bezpečné (pozor na SQL injection!). Filtering môže byť vo forme párov key:value, ktoré sa na serveri spracujú ako podmienky v dotaze.
V prípade jednoduchého dotazu môžeme použiť JPQL:
TypedQuery<Product> query = em.createQuery(
"SELECT p FROM Product p WHERE p.category = :category ORDER BY p.price ASC", Product.class);
query.setParameter("category", "electronics");
query.setFirstResult(offset);
query.setMaxResults(limit);
List<Product> result = query.getResultList();
Ak potrebujete dynamicky meniť podmienky a poradie, odporúča sa použiť Criteria API:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Product> cq = cb.createQuery(Product.class);
Root<Product> root = cq.from(Product.class);
cq.select(root);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("category"), "electronics"));
cq.where(cb.and(predicates.toArray(new Predicate[0])));
cq.orderBy(cb.asc(root.get("price")));
TypedQuery<Product> query = em.createQuery(cq);
query.setFirstResult(offset);
query.setMaxResults(limit);
Odpoveď z API by mala okrem samotných dát obsahovať aj informácie o stránkovaní:
{
"data": [ /* zoznam produktov */ ],
"pagination": {
"offset": 0,
"limit": 10,
"total": 83,
"next": "/api/products?offset=10&limit=10",
"prev": null
}
}
Takáto štruktúra uľahčuje frontend vývojárom implementáciu stránkovaného UI (napr. s tlačidlami „Ďalšia stránka“, „Predchádzajúca stránka“).
V moderných SPA aplikáciách (Single Page Application) sa stránkovanie vykonáva pomocou AJAX requestov. Príklad v Reacte:
useEffect(() => {
fetch(`/api/products?offset=${offset}&limit=10`)
.then(res => res.json())
.then(data => setProducts(data.data));
}, [offset]);
V Angulari môžete použiť HttpClient a rxjs switchMap pre reakciu na zmenu stránky. Dôležité je testovať správanie pri:
Stránkovanie, triedenie a filtrovanie sú základné prvky moderných REST API. Pomáhajú udržať výkon aplikácie a zároveň poskytujú používateľom komfort pri práci s veľkým objemom dát.
Praktickú implementáciu týchto princípov si môžete vyskúšať na kurze Java REST služby s Hibernate a JPA, kde sa naučíte navrhovať škálovateľné a užívateľsky prívetivé API pre reálne aplikácie.
Viac informacií preberáme na kurze: