Rumah >pembangunan bahagian belakang >Golang >Membawa Penomboran ke Tahap Seterusnya: Isih dan Penapisan dalam API Go

Membawa Penomboran ke Tahap Seterusnya: Isih dan Penapisan dalam API Go

Susan Sarandon
Susan Sarandonasal
2025-01-23 00:38:11852semak imbas

Dalam siaran terakhir, kami telah menangani Penomboran memecahkan respons API yang besar kepada bahagian yang boleh diurus. Tetapi jika anda pernah mahu membenarkan pengguna mengawal cara data diisih atau menapis hasil khusus, maka anda sudah bersedia untuk langkah seterusnya: isih dan menapis.
Mari kita selami dan jadikan API kita lebih berkuasa dengan menambahkan ciri ini.

Jika anda belum melalui tutorial sebelumnya, inilah pautannya.

Mengapa Isih dan Penapisan Perkara

Image description
Penomboran sahaja tidak selalu mencukupi. Bayangkan pengguna mencari item terbaharu atau hanya yang dibuat dalam jangka masa tertentu. Isih dan penapisan membenarkan pengguna:

- Isih: Pilih susunan hasil (cth. terbaharu hingga yang paling lama)
- Penapis: Kecilkan hasil kepada perkara yang mereka perlukan (cth. item yang dibuat hari ini)

Dengan menggabungkan penomboran dengan pengisihan dan penapisan, kami mencipta API yang lebih mesra pengguna.

Memperluas Pertanyaan Pangkalan Data Kami

Kami akan membina jadual item dari blog sebelumnya. Untuk imbas kembali, berikut ialah skemanya:

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

Menambah Isih

Isih adalah tentang memesan hasil. Kami akan membenarkan pengguna mengisih mengikut nama atau lajur create_at dalam tertib menaik atau menurun.

Langkah 1: Terima Parameter Isih

Pengguna akan lulus dua parameter pertanyaan:

  • isihan : Lajur untuk diisih mengikut ( nama atau dicipta_di ).
  • tertib : Arah isihan ( asc atau desc ).

Contoh URL:

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

Langkah 2: Laraskan Pertanyaan SQL

Kami akan mengubah suai pertanyaan SQL secara dinamik untuk memasukkan pengisihan:

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

Menambah Penapisan

Penapisan membolehkan pengguna memperhalusi carian mereka. Contohnya, kita boleh menapis item mengikut julat tarikh atau item yang mengandungi kata kunci tertentu dalam namanya.

Langkah 1: Terima Parameter Penapis

Kami akan menyokong dua penapis:

  • nama : Cari item yang mengandungi subrentetan tertentu.
  • created_after : Ambil item yang dibuat selepas tarikh tertentu.

Contoh URL :

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

Langkah 2: Laraskan Pertanyaan SQL

Kami akan menambah WHERE syarat untuk mengendalikan penapis ini:

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

Menguji API Dipertingkat

  • Isih mengikut nama dalam tertib menaik:
/items?page=1&limit=10&sort=created_at&order=desc
  • Menapis item yang dibuat selepas tarikh tertentu:
// 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
}
  • Menggabungkan penapis dan pengisihan:
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777

Kesilapan Biasa yang Perlu Dielakkan

Tidak mengesahkan input pengguna: Membenarkan lajur sewenang-wenangnya atau susunan isihan yang tidak sah boleh mendedahkan pangkalan data anda kepada suntikan SQL. Sentiasa sahkan input.

Kesimpulan / Langkah Seterusnya

Anda boleh mendapatkan repositori kod lengkap untuk tutorial ini di sini

Dengan penomboran, pengisihan dan penapisan, API anda kini lebih mesra pengguna dan fleksibel. Untuk kefungsian yang lebih maju, pertimbangkan untuk menambah:

  • Penomboran berasaskan kursor untuk set data yang besar.
  • Penapisan bermuka untuk carian yang rumit.

Nantikan siaran seterusnya di mana kami akan meneroka teknik lanjutan ini!

Untuk mendapatkan maklumat lanjut tentang konsep, projek, dsb. Golang dan untuk terus dikemas kini tentang Tutorial, ikuti Siddhesh di Twitter dan GitHub.

Sehingga itu Teruskan Belajar, Teruskan Membina ??

Atas ialah kandungan terperinci Membawa Penomboran ke Tahap Seterusnya: Isih dan Penapisan dalam API Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Penyata Kawalan Aliran dalam GoArtikel seterusnya:Penyata Kawalan Aliran dalam Go