Heim >Backend-Entwicklung >Golang >Paginierung auf die nächste Ebene bringen: Sortieren und Filtern in Go-APIs
Im letzten Beitrag haben wir uns mit der Paginierung befasst, die große API-Antworten in überschaubare Teile zerlegt. Wenn Sie jedoch schon immer den Benutzern die Kontrolle darüber überlassen wollten, wie Daten sortiert werden oder bestimmte Ergebnisse filtern, dann sind Sie bereit für den nächsten Schritt: Sortieren und Filtern.
Lassen Sie uns eintauchen und unsere APIs noch leistungsfähiger machen, indem wir diese Funktionen hinzufügen.
Wenn Sie das vorherige Tutorial noch nicht durchgelesen haben, finden Sie hier den Link.
Paginierung allein reicht nicht immer aus. Stellen Sie sich vor, ein Benutzer sucht nach den neuesten Artikeln oder nur nach Artikeln, die in einem bestimmten Zeitraum erstellt wurden. Durch Sortieren und Filtern können Benutzer:
- Sortieren: Wählen Sie die Reihenfolge der Ergebnisse (z. B. vom Neuesten zum Ältesten)
- Filter: Ergebnisse auf das eingrenzen, was sie benötigen (z. B. heute erstellte Artikel)
Durch die Kombination von Paginierung mit Sortieren und Filtern schaffen wir eine benutzerfreundlichere API.
Wir bauen auf der Artikeltabelle aus dem vorherigen Blog auf. Um es noch einmal zusammenzufassen: Hier ist das Schema:
CREATE TABLE items ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW() );
Beim Sortieren geht es darum, die Ergebnisse zu ordnen. Wir ermöglichen Benutzern das Sortieren nach den Spalten „name“ oder „created_at“ in aufsteigender oder absteigender Reihenfolge.
Benutzer übergeben zwei Abfrageparameter:
Beispiel-URL:
/items?page=1&limit=10&sort=created_at&order=desc
Wir ändern die SQL-Abfrage dynamisch, um die Sortierung einzuschließen:
// 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 }
Durch Filtern können Benutzer ihre Suche verfeinern. Beispielsweise können wir Artikel nach einem Datumsbereich oder nach Artikeln filtern, die ein bestimmtes Schlüsselwort im Namen enthalten.
Wir unterstützen zwei Filter:
Beispiel-URL:
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
Wir fügen WHERE-Bedingungen hinzu, um diese Filter zu verarbeiten:
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
Benutzereingaben werden nicht validiert: Das Zulassen beliebiger Spalten oder ungültiger Sortierreihenfolgen kann Ihre Datenbank einer SQL-Injection aussetzen. Validieren Sie Eingaben immer.
Das vollständige Code-Repository für dieses Tutorial finden Sie hier
Mit der vorhandenen Paginierung, Sortierung und Filterung ist Ihre API jetzt benutzerfreundlicher und flexibler. Für noch erweiterte Funktionen sollten Sie Folgendes hinzufügen:
Bleiben Sie gespannt auf den nächsten Beitrag, in dem wir diese fortgeschrittenen Techniken erkunden werden!
Um weitere Informationen über Golang-Konzepte, -Projekte usw. zu erhalten und über die Tutorials auf dem Laufenden zu bleiben, folgen Sie Siddhesh auf Twitter und GitHub.
Bis dahin Lernen Sie weiter, Bauen Sie weiter ??
Das obige ist der detaillierte Inhalt vonPaginierung auf die nächste Ebene bringen: Sortieren und Filtern in Go-APIs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!