首頁 >後端開發 >Golang >將分頁提升到新的水平:Go API 中的排序和過濾

將分頁提升到新的水平:Go API 中的排序和過濾

Susan Sarandon
Susan Sarandon原創
2025-01-23 00:38:11852瀏覽

在上一篇文章中,我們解決了分頁將大型 API 回應分解為可管理的區塊的問題。但是,如果您曾經想讓使用者控制資料的排序方式過濾特定結果,那麼您就可以進行下一步:排序並且過濾
讓我們深入研究並透過添加這些功能使我們的 API 變得更加強大。

如果您尚未完成先前的教學課程,請點擊此處。

為什麼排序和過濾很重要

Image description
單獨分頁並不總是足夠的。想像一下,使用者搜尋最新的項目或僅搜尋在特定時間範圍內建立的項目。排序和過濾讓使用者:

- 排序: 選擇結果的順序(例如最新到最舊)
- 過濾器: 將結果縮小到他們需要的範圍(例如今天創建的項目)

透過將分頁與排序和過濾結合,我們創建了一個更用戶友好的 API。

擴展我們的資料庫查詢

我們將基於上一篇部落格中的項目表進行建構。回顧一下,這是該計劃:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

新增排序

排序就是將結果排序。我們將允許使用者按名稱或created_at列以升序或降序排序。

第 1 步:接受排序參數

使用者將傳遞兩個查詢參數:

  • sort :要排序的欄位(名稱或created_at)。
  • order :排序方向( asc 或 desc )。

範例網址:

/items?page=1&limit=10&sort=created_at&order=desc

第2步:調整SQL查詢

我們將動態修改 SQL 查詢以包含排序:

// 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
}

添加過濾

過濾讓使用者可以優化他們的搜尋。例如,我們可以按日期範圍過濾項目或名稱中包含特定關鍵字的項目。

第 1 步:接受過濾器參數

我們將支援兩個過濾器:

  • name : 搜尋包含特定子字串的項目。
  • created_after :取得在特定日期之後建立的項目。

範例網址:

/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777

第2步:調整SQL查詢

我們將加入 WHERE 條件來處理這些過濾器:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

測試增強型 API

  • 依名稱升序排列:
/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

要避免的常見錯誤

不驗證使用者輸入:允許任意列或無效的排序順序可能會使您的資料庫遭受 SQL 注入。始終驗證輸入。

結論/後續步驟

您可以在此處找到本教學的完整程式碼儲存庫

透過分頁、排序​​和過濾,您的 API 現在更加用戶友好和靈活。對於更高級的功能,請考慮新增:

  • 基於遊標的分頁適用於大型資料集。
  • 分面過濾用於複雜搜尋。

請繼續關注下一篇文章,我們將探索這些先進技術!

要獲取有關 Golang 概念、專案等的更多資訊並隨時了解教程的最新動態,請在 Twitter 和 GitHub 上關注 Siddhesh。

在那之前繼續學習繼續建造 ??

以上是將分頁提升到新的水平:Go API 中的排序和過濾的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn