Moderní API se stránkováním a řazením: Jak zlepšit použitelnost vaší REST služby

Při návrhu REST API je důležité myslet na škálovatelnost a výkon. Pokud služba vrací stovky nebo tisíce záznamů najednou, zatěžuje nejen server, ale i klienta. Řešením je stránkování, řazení a filtrování – základní stavební kameny moderního API. Tento článek ukazuje, jak tyto techniky implementovat v Java EE pomocí JPA a Hibernate.

1. Vysvětlení stránkování (offset, limit) a proč je důležité pro výkon

Stránkování znamená, že API nevrací všechny záznamy najednou, ale pouze omezený výřez. Nejčastěji se používá:

?offset=0&limit=20

Tím získáte prvních 20 záznamů. Tento přístup zajišťuje:

2. Tvorba parametrů pro řazení a filtrování (sortBy, order, filter)

Moderní API by mělo být flexibilní – klient si může určit, podle čeho a jak má být výstup řazen nebo filtrován:

/api/products?offset=0&limit=10&sortBy=price&order=desc&filter=category:books

Řazení by mělo být kontrolováno whitelistem dostupných polí. Filtrování lze provést jednoduše pomocí klíč-hodnota párů, které se převedou do podmínek v dotazu.

3. Implementace v JPA/Hibernate (JPQL, Criteria API)

Ukázka jednoduchého dotazu pomocí JPQL:

TypedQuery<Product> query = em.createQuery(
  "SELECT p FROM Product p WHERE p.category = :category ORDER BY p.price DESC", Product.class);
query.setParameter("category", "books");
query.setFirstResult(offset);
query.setMaxResults(limit);
List<Product> result = query.getResultList();
  

Pro dynamické dotazy se hodí Criteria API, které umožňuje vytvářet podmínky podle potřeby:

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"), "books"));
cq.where(cb.and(predicates.toArray(new Predicate[0])));
cq.orderBy(cb.desc(root.get("price")));

TypedQuery<Product> query = em.createQuery(cq);
query.setFirstResult(offset);
query.setMaxResults(limit);
  

4. Návrh API odpovědí (zabalení dat do JSON, odkazy na další/předchozí stránky)

API by mělo kromě dat obsahovat i metainformace:

{
  "data": [ /* seznam produktů */ ],
  "pagination": {
    "offset": 0,
    "limit": 10,
    "total": 83,
    "next": "/api/products?offset=10&limit=10",
    "prev": null
  }
}
  

To usnadňuje implementaci klientské logiky a zlepšuje navigaci mezi stránkami.

5. Testování a ladění stránkování ve frontendu (AJAX, React, Angular)

Ve SPA aplikacích se stránkování provádí pomocí AJAX volání. Příklad v Reactu:

useEffect(() => {
  fetch(`/api/products?offset=${offset}&limit=10`)
    .then(res => res.json())
    .then(data => setProducts(data.data));
}, [offset]);
  

V Angularu použijte HttpClient a observables pre reakciu na pagináciu. Testujte:

Závěr

Řazení, stránkování a filtrování jsou základní nástroje pro optimalizaci REST API. Pomáhají snížit zátěž backendu, zlepšují odezvu a zajišťují vyšší komfort při práci s daty.

Chcete-li si celý proces vyzkoušet prakticky, doporučujeme kurz Java REST služby s Hibernate a JPA, kde si osvojíte vývoj škálovatelných a efektivních REST aplikací v reálném prostředí.

Jak začít programovat?

Úvod do programování pro každého bez předchozích znalostí.

Stáhněte si náš ebook teď výjimečně zdarma!!!

Viac informacií preberáme na kurze:

Kurz JAVAEEREST - JAVA REST - RESTful Webové služby s Hibernate

Marián Knězek