🔥 Firehook

Blog · api rest

Pagination, filtrage et tri dans une API REST

Concevoir une pagination, un filtrage et un tri coherents pour des API REST fiables et predictibles.

Passerelle API avec flux structure, symbolisant pagination et filtrage

Pourquoi le design de requete compte

Les gros volumes sont inevitables. Sans pagination et filtrage, les clients tentent de tout recuperer et l'API devient lente.

Des regles claires protegent le backend et rendent l'integration plus simple.

Pagination offset : simple mais fragile

L'offset (`page` + `limit`) est facile a comprendre et a implementer. C'est un bon choix pour les petites collections.

Mais si les donnees changent, les pages se deplacent et peuvent creer des doublons.

Pagination cursor : stable et scalable

La pagination cursor utilise un pointeur vers le dernier element vu. Elle reste stable meme si les donnees changent.

Elle est plus complexe, mais recommandee pour les gros volumes.

Le tri doit etre explicite

Exposez un parametre `sort` et documentez les champs. Exemple : `sort=created_at` ou `sort=-created_at`.

Le tri doit etre deterministe, sinon la pagination devient incoherente.

Regles de filtrage

Utilisez les query params : `/orders?status=paid&customer_id=123`. C'est flexible et evolutif.

Evitez d'encoder les filtres dans le chemin sauf pour une ressource distincte.

Selection de champs

Un parametre `fields` permet de reduire la taille des reponses. C'est utile pour les clients mobiles.

Gardez une liste de champs autorises pour eviter l'exposition de donnees sensibles.

Metadonnees et totaux

Les totaux peuvent etre couteux. Retournez-les seulement si necessaire.

Pour la pagination cursor, `next_cursor` et `has_next` suffisent souvent.

Gestion des erreurs

Un filtre invalide doit renvoyer un 400 avec un message clair. Cela evite les erreurs silencieuses.

La requete fait partie du contrat : documentez-la et gardez-la stable.

FAQ

La pagination cursor est-elle toujours meilleure ?
Elle est plus stable sur gros volumes, mais l'offset est plus simple pour des collections modestes.
Comment exposer le tri ?
Utilisez un parametre `sort` avec un champ et une direction, par exemple `sort=-created_at`.
Filtres dans le chemin ou en query ?
Mettez les filtres en query pour garder les chemins centres sur les ressources.
Comment renvoyer un total ?
Renvoyez un total si utile, mais attention aux couts. Un endpoint dedie peut etre preferable.
Et la pagination sur des resultats filtres ?
On filtre d'abord, puis on pagine. La regle doit etre stable et documentee.