Dans le dernier article, nous avons abordé la Pagination décomposant les grandes réponses API en morceaux gérables. Mais si vous avez toujours voulu laisser les utilisateurs contrôler la façon dont les données sont triées ou filtrer des résultats spécifiques, alors vous êtes prêt pour l'étape suivante : tri et filtrage.
Allons-y et rendons nos API encore plus puissantes en ajoutant ces fonctionnalités.
Si vous n'avez pas parcouru le tutoriel précédent, voici le lien.
La pagination seule ne suffit pas toujours. Imaginez un utilisateur recherchant les éléments les plus récents ou uniquement ceux créés dans un laps de temps spécifique. Le tri et le filtrage permettent aux utilisateurs :
- Trier : Choisissez l'ordre des résultats (par exemple du plus récent au plus ancien)
- Filtre : Affinez les résultats en fonction de ce dont ils ont besoin (par exemple, les éléments créés aujourd'hui)
En combinant la pagination avec le tri et le filtrage, nous créons une API plus conviviale.
Nous nous baserons sur le tableau des éléments du blog précédent. Pour récapituler, voici le schéma :
CREATE TABLE items ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW() );
Le tri consiste à classer les résultats. Nous permettra aux utilisateurs de trier par nom ou par colonnes create_at par ordre croissant ou décroissant.
Les utilisateurs transmettront deux paramètres de requête :
Exemple d'URL :
/items?page=1&limit=10&sort=created_at&order=desc
Nous modifierons dynamiquement la requête SQL pour inclure le tri :
// Extract sort and order query parameters sort := r.URL.Query().Get("sort") order := r.URL.Query().Get("order") // Validate the sort column validSortColumns := map[string]bool{"name": true, "created_at": true} if !validSortColumns[sort] { sort = "created_at" // Default sort column } // Validate the sort order if order != "asc" && order != "desc" { order = "asc" // Default sort order } // Modify the SQL query query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT OFFSET ", sort, order) rows, err := db.Query(query, limit, offset) if err != nil { http.Error(w, "Failed to fetch items", http.StatusInternalServerError) return }
Le filtrage permet aux utilisateurs d'affiner leur recherche. Par exemple, nous pouvons filtrer les éléments par plage de dates ou les éléments contenant un mot-clé spécifique dans leur nom.
Nous prendrons en charge deux filtres :
Exemple d'URL :
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
Nous ajouterons des conditions WHERE pour gérer ces filtres :
CREATE TABLE items ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW() );
/items?page=1&limit=10&sort=created_at&order=desc
// Extract sort and order query parameters sort := r.URL.Query().Get("sort") order := r.URL.Query().Get("order") // Validate the sort column validSortColumns := map[string]bool{"name": true, "created_at": true} if !validSortColumns[sort] { sort = "created_at" // Default sort column } // Validate the sort order if order != "asc" && order != "desc" { order = "asc" // Default sort order } // Modify the SQL query query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT OFFSET ", sort, order) rows, err := db.Query(query, limit, offset) if err != nil { http.Error(w, "Failed to fetch items", http.StatusInternalServerError) return }
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
Ne pas valider les entrées utilisateur : autoriser des colonnes arbitraires ou des ordres de tri non valides peut exposer votre base de données à une injection SQL. Validez toujours les entrées.
Vous pouvez trouver le référentiel de code complet de ce tutoriel ici
Avec la pagination, le tri et le filtrage en place, votre API est désormais plus conviviale et flexible. Pour des fonctionnalités encore plus avancées, pensez à ajouter :
Restez à l’écoute pour le prochain article où nous explorerons ces techniques avancées !
Pour obtenir plus d'informations sur les concepts, les projets, etc. Golang et pour rester à jour sur les didacticiels, suivez Siddhesh sur Twitter et GitHub.
D'ici là Continuez à apprendre, Continuez à construire ??
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!