Maison > développement back-end > Golang > Faire passer la pagination au niveau supérieur : tri et filtrage dans les API Go

Faire passer la pagination au niveau supérieur : tri et filtrage dans les API Go

Susan Sarandon
Libérer: 2025-01-23 00:38:11
original
850 Les gens l'ont consulté

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.

Pourquoi le tri et le filtrage sont importants

Image description
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.

Extension de notre requête de base de données

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()
);
Copier après la connexion
Copier après la connexion

Ajout d'un tri

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.

Étape 1 : Accepter les paramètres de tri

Les utilisateurs transmettront deux paramètres de requête :

  • sort : La colonne sur laquelle trier ( name ou create_at ).
  • order : La direction du tri ( asc ou desc ).

Exemple d'URL :

/items?page=1&limit=10&sort=created_at&order=desc
Copier après la connexion
Copier après la connexion

Étape 2 : Ajustez la requête SQL

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
}
Copier après la connexion
Copier après la connexion

Ajout de filtrage

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.

Étape 1 : Accepter les paramètres de filtre

Nous prendrons en charge deux filtres :

  • name : Rechercher des éléments contenant une sous-chaîne spécifique.
  • create_after : Récupère les éléments créés après une date spécifique.

Exemple d'URL :

/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
Copier après la connexion
Copier après la connexion

Étape 2 : Ajustez la requête SQL

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()
);
Copier après la connexion
Copier après la connexion

Test de l'API améliorée

  • Tri par nom par ordre croissant :
/items?page=1&limit=10&sort=created_at&order=desc
Copier après la connexion
Copier après la connexion
  • Filtrer les éléments créés après une date précise :
// 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
}
Copier après la connexion
Copier après la connexion
  • Combinaison de filtres et tri :
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
Copier après la connexion
Copier après la connexion

Erreur courante à éviter

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.

Conclusion / Prochaines étapes

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 :

  • Pagination basée sur un curseur pour les grands ensembles de données.
  • Filtrage à facettes pour les recherches complexes.

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal