Rumah > pembangunan bahagian belakang > Golang > Permudahkan Pengesahan Input Gin dalam Go dengan ginvalidator

Permudahkan Pengesahan Input Gin dalam Go dengan ginvalidator

Linda Hamilton
Lepaskan: 2024-12-01 11:52:11
asal
894 orang telah melayarinya

Simplify Gin Input Validation in Go with ginvalidator

Gambaran keseluruhan

ginvalidator ialah satu set middleware Gin yang membungkus koleksi luas pengesah dan sanitizer yang ditawarkan oleh validatorgo pakej sumber terbuka saya yang lain. Ia juga menggunakan pakej sumber terbuka yang popular gjson untuk sintaks medan JSON, menyediakan pertanyaan dan pengekstrakan data yang cekap daripada objek JSON.

Ia membolehkan anda menggabungkannya dalam pelbagai cara supaya anda boleh mengesahkan dan membersihkan permintaan Gin anda, serta menawarkan alatan untuk menentukan sama ada permintaan itu sah atau tidak, data yang dipadankan mengikut pengesah anda.

Ia berdasarkan pengesah ekspres perpustakaan js/express popular

Sokongan

Versi ginvalidator ini memerlukan aplikasi anda dijalankan pada Go 1.16 .
Ia juga disahkan untuk berfungsi dengan Gin 1.x.x.

Rasional

Mengapa tidak menggunakan?

  • Pengesah Tulisan Tangan: Anda boleh menulis logik pengesahan anda sendiri secara manual, tetapi itu menjadi berulang dan cepat berantakan. Setiap kali anda memerlukan pengesahan baharu, anda menulis jenis kod yang sama berulang kali. Mudah membuat kesilapan, dan susah untuk dikekalkan.
  • Pengikatan dan Pengesahan Model Terbina Dalam Gin: Gin mempunyai pengesahan terbina dalam, tetapi ia tidak sesuai untuk semua orang. Teg struktur mengehadkan dan menjadikan kod anda lebih sukar dibaca, terutamanya apabila anda memerlukan peraturan yang rumit. Selain itu, pengesahan terikat terlalu ketat pada model anda, yang tidak bagus untuk fleksibiliti.
  • Perpustakaan Lain (seperti Galidator): Terdapat perpustakaan lain di luar sana, tetapi mereka sering berasa terlalu rumit untuk apa yang mereka lakukan. Ia memerlukan lebih banyak persediaan dan kerja daripada yang anda jangkakan, terutamanya apabila anda hanya mahukan penyelesaian yang mudah dan mudah untuk pengesahan.

Pemasangan

Pastikan anda telah memasang Go pada mesin anda.

Langkah 1: Buat Modul Go Baharu

  1. Buat folder kosong dengan nama pilihan anda.
  2. Buka terminal, navigasi (cd) ke dalam folder itu dan mulakan modul Go baharu:
go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Langkah 2: Pasang Pakej Diperlukan

Gunakan go get untuk memasang pakej yang diperlukan.

  1. Pasang Gin:
go get -u github.com/gin-gonic/gin
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  1. Pasang ginvalidator:
go get -u github.com/bube054/ginvalidator
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Bermula

Salah satu cara terbaik untuk mempelajari sesuatu adalah melalui teladan! Jadi mari kita singsingkan lengan baju dan dapatkan beberapa pengekodan berlaku.

Persediaan

Perkara pertama yang diperlukan ialah pelayan Gin sedang berjalan. Mari kita laksanakan yang mengucapkan hai kepada seseorang; untuk ini, buat main.go kemudian tambah kod berikut:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang jalankan fail ini dengan melaksanakan go run main.go pada terminal anda.

go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pelayan HTTP sepatutnya berjalan dan anda boleh membuka http://localhost:8080/hello?person=John untuk memberi hormat kepada John!

? Petua:
Anda boleh menggunakan Air dengan Go dan Gin untuk melaksanakan tambah nilai secara langsung. Ini secara automatik memulakan semula pelayan apabila fail ditukar, jadi anda tidak perlu melakukannya sendiri!

Menambah pengesah

Jadi pelayan berfungsi, tetapi terdapat masalah dengannya. Paling ketara, anda tidak mahu bertanya khabar kepada seseorang apabila nama orang itu tidak ditetapkan.
Contohnya, pergi ke http://localhost:8080/hello akan mencetak "Hello, ".

Di situlah ginvalidator berguna. Ia menyediakan pengesah, sanitizer dan pengubah suai yang digunakan untuk mengesahkan permintaan anda.
Mari tambahkan pengesah dan pengubah suai yang menyemak bahawa rentetan pertanyaan orang tidak boleh kosong, dengan pengesah bernama Kosong dan pengubah bernama Not:

go get -u github.com/gin-gonic/gin
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

? Nota:

Untuk ringkasnya, gv digunakan sebagai alias untuk ginvalidator dalam contoh kod.

Sekarang, mulakan semula pelayan anda dan pergi ke http://localhost:8080/hello sekali lagi. Hmm, masih tertera "Hello, !"... kenapa?

Mengendalikan ralat pengesahan

rantaian pengesahan ginvalidator tidak melaporkan ralat pengesahan kepada pengguna secara automatik.
Sebabnya adalah mudah: semasa anda menambah lebih banyak pengesah, atau untuk lebih banyak medan, bagaimana anda mahu mengumpul ralat? Adakah anda mahu senarai semua ralat, hanya satu setiap medan, hanya satu keseluruhan...?

Jadi langkah seterusnya yang jelas ialah menukar kod di atas sekali lagi, kali ini mengesahkan hasil pengesahan dengan fungsi ValidationResult:

go get -u github.com/bube054/ginvalidator
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang, jika anda mengakses http://localhost:8080/hello sekali lagi, anda akan melihat kandungan JSON berikut, diformatkan untuk kejelasan:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang, perkara ini memberitahu kami ialah

  • terdapat tepat satu ralat dalam permintaan ini;
  • medan ini dipanggil orang;
  • ia terletak dalam rentetan pertanyaan (lokasi: "pertanyaan");
  • mesej ralat yang diberikan ialah "Nilai tidak sah".

Ini adalah senario yang lebih baik, tetapi ia masih boleh diperbaiki. Jom teruskan.

Mencipta mesej ralat yang lebih baik

Semua pengesah lokasi permintaan menerima hujah kedua pilihan, iaitu fungsi yang digunakan untuk memformat mesej ralat. Jika tiada disediakan, mesej ralat generik lalai akan digunakan, seperti yang ditunjukkan dalam contoh di atas.

go run main.go
Salin selepas log masuk
Salin selepas log masuk

Sekarang jika anda mengakses http://localhost:8080/hello sekali lagi, perkara yang anda akan lihat ialah kandungan JSON berikut, dengan mesej ralat baharu:

package main

import (
    "net/http"

    gv "github.com/bube054/ginvalidator"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", gv.NewQuery("person", nil).
        Chain().
        Not().
        Empty(nil).
        Validate(), func(ctx *gin.Context) {
            person := ctx.Query("person")
            ctx.String(http.StatusOK, "Hello, %s!", person)
        })

    r.Run()
}
Salin selepas log masuk
Salin selepas log masuk

Mengakses data yang disahkan/disanitasi

Anda boleh menggunakan GetMatchedData, yang secara automatik mengumpulkan semua data yang telah disahkan dan/atau dibersihkan oleh ginvalidator. Data ini kemudiannya boleh diakses menggunakan kaedah Dapatkan MatchedData:

go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

buka http://localhost:8080/hello?person=John untuk memberi hormat kepada John!

Lokasi yang tersedia ialah BodyLocation, CookieLocation QueryLocation, ParamLocation dan HeaderLocation.
Setiap lokasi ini termasuk kaedah Rentetan yang mengembalikan lokasi tempat data yang disahkan/disanitasi disimpan.

Membersihkan input

Walaupun pengguna tidak lagi boleh menghantar nama orang kosong, ia masih boleh menyuntik HTML ke halaman anda! Ini dikenali sebagai kerentanan Skrip Silang Tapak (XSS).
Mari lihat bagaimana ia berfungsi. Pergi ke http://localhost:8080/hello?person=John, dan anda seharusnya melihat "Hello, John!".
Walaupun contoh ini baik, penyerang boleh menukar rentetan pertanyaan orang kepada teg yang memuatkan JavaScriptnya sendiri yang boleh membahayakan.
Dalam senario ini, satu cara untuk mengurangkan isu dengan ginvalidator ialah menggunakan sanitizer, terutamanya Escape, yang mengubah aksara HTML khas dengan yang lain yang boleh diwakili sebagai teks.

go get -u github.com/gin-gonic/gin
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang, jika anda memulakan semula pelayan dan memuat semula halaman, perkara yang anda akan lihat ialah "Helo, John!". Halaman contoh kami tidak lagi terdedah kepada XSS!

⚠️ Awas:

ginvalidator tidak mengubah suai http.Minta nilai semasa sanitasi. Untuk mengakses data yang telah dibersihkan, sentiasa gunakan fungsi GetMatchedData.

Rantaian Pengesahan

Rantai pengesahan ialah salah satu konsep utama dalam ginvalidator, oleh itu adalah berguna untuk mempelajarinya, supaya anda boleh menggunakannya dengan berkesan.

Tetapi jangan risau: jika anda telah membaca panduan Bermula, anda telah menggunakan rantaian pengesahan tanpa perasan!

Apakah rantai pengesahan?

Rantai pengesahan dibuat menggunakan fungsi berikut, setiap satu menyasarkan lokasi tertentu dalam permintaan HTTP:

  • NewBody: Mengesahkan data daripada badan http.Request. Lokasinya ialah BodyLocation.
  • NewCookie: Mengesahkan data daripada http.Request cookies. Lokasinya ialah CookieLocation.
  • NewHeader: Mengesahkan data daripada pengepala http.Request. Lokasinya ialah HeaderLocation.
  • NewParam: Mengesahkan data daripada parameter laluan Gin. Lokasinya ialah ParamLocation.
  • NewQuery: Mengesahkan data daripada parameter pertanyaan http.Request. Lokasinya ialah QueryLocation.

Mereka mempunyai nama ini kerana mereka membungkus nilai medan dengan pengesahan (atau sanitasi), dan setiap kaedahnya mengembalikan dirinya sendiri.
Corak ini biasanya dipanggil kaedah rantaian, oleh itu mengapa nama rantai pengesahan.

Rantai pengesahan bukan sahaja mempunyai beberapa kaedah berguna untuk mentakrifkan pengesahan, sanitasi dan pengubahsuaian tetapi ia juga mempunyai kaedah Validate yang mengembalikan fungsi pengendali middleware Gin.

Ini ialah contoh cara rantaian pengesahan biasanya digunakan dan cara anda boleh membacanya:

go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ciri-ciri

Rantai pengesahan mempunyai tiga jenis kaedah: pengesah, sanitizer dan pengubah suai.

Pengesah menentukan sama ada nilai medan permintaan adalah sah. Ini bermakna menyemak sama ada medan itu dalam format yang anda harapkan. Contohnya, jika anda sedang membina borang pendaftaran, keperluan anda mungkin nama pengguna mestilah alamat e-mel dan kata laluan mestilah sekurang-kurangnya 8 aksara.

Jika nilai tidak sah, ralat direkodkan untuk medan tersebut menggunakan beberapa mesej ralat. Ralat pengesahan ini kemudiannya boleh diambil pada titik kemudian dalam pengendali laluan Gin dan dikembalikan kepada pengguna.

Mereka ialah:

  • CustomValidator
  • Mengandungi
  • Sama dengan
  • AbaRouting
  • Selepas
  • Alfa
  • Alfanumerik
  • Ascii
  • Base32
  • Base58
  • Base64
  • Sebelum ini
  • Bic
  • Boolean
  • Alamat BTC
  • ByteLength
  • Kad Kredit
  • Mata wang
  • DataURI
  • Tarikh
  • Perpuluhan
  • DivisibleOleh
  • EAN
  • E-mel
  • Kosong
  • Alamat Ethereum
  • Apung
  • FQDN
  • IDKontainer Barang
  • Lebar Penuh
  • Separuh Lebar
  • Hash
  • Heksadesimal
  • HexColor
  • HSL
  • IBAN
  • Kad Pengenalan
  • IMEI
  • Dalam
  • Int
  • IP
  • Julat IP
  • ISIN
  • ISO4217
  • ISO6346
  • ISO6391
  • ISO8601
  • ISO31661Alpha2
  • ISO31661Alpha3
  • ISO31661Numeric
  • ISRC
  • ISSN
  • JSON
  • LatLong
  • Plat Lesen
  • Tempatan
  • Huruf Kecil
  • Nombor Luhn
  • MacAddress
  • MagnetURI
  • MailtoURI
  • MD5
  • MimeType
  • Telefon Mudah Alih
  • MongoID
  • Berbilangbait
  • Numerik
  • Oktal
  • Nombor Pasport
  • Pelabuhan
  • Kod Pos
  • RFC3339
  • Warna Rgb
  • SemVer
  • Slug
  • Kata Laluan Kuat
  • ID Cukai
  • Pasangan Pengganti
  • Masa
  • ULID
  • Huruf Besar
  • URL
  • UUID
  • Lebar Pembolehubah
  • VAT
  • Disenarai putih
  • Perlawanan

Sanitizer mengubah nilai medan. Ia berguna untuk menghilangkan bunyi daripada nilai dan mungkin juga untuk menyediakan beberapa garis pertahanan asas terhadap ancaman.

Sanitizer mengekalkan nilai medan yang dikemas kini kembali ke dalam Konteks Gin, supaya ia boleh digunakan oleh fungsi ginvalidator lain, kod pengendali laluan anda sendiri dan juga middleware lain.

Mereka ialah:

  • CustomSanitizer
  • Senarai Hitam
  • Melarikan diri
  • LTrim
  • NormalizeEmail
  • RTrim
  • StripLow
  • ToBoolean
  • ToDate
  • ToFloat
  • ToInt
  • Pangkas
  • Unescape
  • Senarai Putih

Pengubah suai mentakrifkan bagaimana rantaian pengesahan bertindak apabila ia dijalankan.

Mereka ialah:

  • Ikat jamin
  • Jika
  • Bukan
  • Langkau
  • Pilihan

? Nota:

Kaedah ini didokumenkan dengan teliti menggunakan GoDoc dalam dokumentasi ginvalidator pkg.go.dev. Jika sebarang butiran tidak jelas, anda juga boleh merujuk kepada fungsi berkaitan dalam pakej validatorgo untuk konteks tambahan, yang akan saya jelaskan di bawah.

Pengesah/pembersih standard

Semua fungsi yang didedahkan oleh rantaian pengesahan sebenarnya berasal daripada validatorgo, salah satu pakej sumber terbuka saya yang lain yang mengkhusus dalam pengesahan/sanitasi rentetan. Sila semaknya, bintang dan kongsi ???, Terima Kasih.

Ini termasuk semua validatorgo validator dan sanitizer, daripada IsEmail, IsLength dan Trim yang biasa digunakan kepada IsISBN, IsMultibait dan StripLow yang lebih khusus!

Ini dipanggil pengesah standard dan sanitizer standard dalam ginvalidator. Tetapi tanpa awalan Is daripada validatorgo.

Perintah rantai

Tertib anda memanggil kaedah pada rantaian pengesahan biasanya penting.
Ia hampir selalu dijalankan mengikut tertib yang ditentukan, oleh itu anda boleh mengetahui perkara yang akan dilakukan oleh rantaian pengesahan hanya dengan membaca definisinya, daripada kaedah berantai pertama hingga terakhir.

Ambil coretan berikut sebagai contoh:

go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kes ini, jika pengguna memberikan nilai "search_query" yang terdiri daripada ruang putih sahaja, nilai itu tidak akan kosong, oleh itu pengesahan lulus. Tetapi memandangkan sanitizer .Trim() ada, ruang putih akan dialih keluar dan medan akan menjadi kosong, jadi anda sebenarnya mendapat positif palsu.

Sekarang, bandingkan dengan coretan di bawah:

go get -u github.com/gin-gonic/gin
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Rantaian ini akan mengalih keluar ruang putih dengan lebih bijak, dan kemudian mengesahkan jika nilainya tidak kosong.

Satu pengecualian kepada peraturan ini ialah .Optional(): Ia boleh diletakkan pada mana-mana titik dalam rantai dan ia akan menandakan rantai sebagai pilihan.

Menggunakan semula rantai pengesahan

Jika anda ingin menggunakan semula rantai yang sama, adalah idea yang baik untuk mengembalikannya daripada fungsi:

go get -u github.com/bube054/ginvalidator
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pemilihan Medan

Dalam ginvalidator, medan ialah sebarang nilai yang sama ada disahkan atau dibersihkan dan ia adalah rentetan.

Hampir hampir setiap fungsi atau nilai yang dikembalikan oleh medan rujukan ginvalidator dalam beberapa cara. Atas sebab ini, adalah penting untuk memahami sintaks laluan medan semasa memilih medan untuk pengesahan dan semasa mengakses ralat pengesahan atau data yang disahkan.

Sintaks

  • Medan isi hanya sah untuk Jenis Kandungan berikut:

    • application/json: Ini menggunakan sintaks laluan GJSON untuk mengekstrak nilai. Sila rujuk dokumentasi yang dipautkan untuk butiran.
    • Contoh:
    go mod init example.com/learning
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Dengan nama pengguna laluan, nilai yang diekstrak ialah "John".

    • application/x-www-form-urlencoded: Biasanya digunakan untuk penyerahan borang HTML. Medan diserahkan sebagai pasangan nilai kunci dalam kandungan.
    • Contoh:
    go get -u github.com/gin-gonic/gin
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Badan:

    go get -u github.com/bube054/ginvalidator
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Medan "nama" akan mempunyai nilai "John", dan "e-mel" akan mempunyai nilai "john.doe@example.com".

    • multipart/form-data: Biasa digunakan untuk muat naik fail atau semasa menyerahkan data borang dengan fail.
    • Contoh:
    package main
    
    import (
        "net/http"
    
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        r := gin.Default()
    
        r.GET("/hello", func(ctx *gin.Context) {
            person := ctx.Query("person")
            ctx.String(http.StatusOK, "Hello, %s!", person)
        })
    
        r.Run() // listen and serve on 0.0.0.0:8080
    }
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Badan:

    go run main.go
    
    Salin selepas log masuk
    Salin selepas log masuk

    Medan "nama" akan mempunyai nilai "John", dan "fail" ialah fail yang dimuat naik.

  • Medan pertanyaan sepadan dengan parameter carian URL dan nilainya secara automatik tidak dielakkan oleh Gin.

    Contoh:

    • Medan: "nama", Nilai: "John"
    package main
    
    import (
        "net/http"
    
        gv "github.com/bube054/ginvalidator"
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        r := gin.Default()
    
        r.GET("/hello", gv.NewQuery("person", nil).
            Chain().
            Not().
            Empty(nil).
            Validate(), func(ctx *gin.Context) {
                person := ctx.Query("person")
                ctx.String(http.StatusOK, "Hello, %s!", person)
            })
    
        r.Run()
    }
    
    Salin selepas log masuk
    Salin selepas log masuk
    • Medan: "full_name", Nilai: "John Doe"
    package main
    
    import (
        "net/http"
    
        gv "github.com/bube054/ginvalidator"
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        r := gin.Default()
    
        r.GET("/hello",
            gv.NewQuery("person", nil).
                Chain().
                Not().
                Empty(nil).
                Validate(),
            func(ctx *gin.Context) {
                result, err := gv.ValidationResult(ctx)
                if err != nil {
                    ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
                        "message": "The server encountered an unexpected error.",
                    })
                    return
                }
    
                if len(result) != 0 {
                    ctx.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
                        "errors": result,
                    })
                    return
                }
    
                person := ctx.Query("person")
                ctx.String(http.StatusOK, "Hello, %s!", person)
            })
    
        r.Run()
    }
    
    Salin selepas log masuk
  • Medan Param mewakili parameter laluan URL dan nilainya tidak dilepaskan secara automatik oleh ginvalidator.

    Contoh:

    • Medan: "id", Nilai: "123"
    {
      "errors": [
        {
          "location": "queries",
          "message": "Invalid value",
          "field": "person",
          "value": ""
        }
      ]
    }
    
    Salin selepas log masuk
  • Medan pengepala ialah pengepala permintaan HTTP dan nilainya tidak terlepas. Amaran log akan muncul jika anda memberikan kunci pengepala bukan kanonik.

    Contoh:

    • Medan: "Ejen Pengguna", Nilai: "Mozilla/5.0"
    package main
    
    import (
        "net/http"
    
        gv "github.com/bube054/ginvalidator"
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        r := gin.Default()
    
        r.GET("/hello",
            gv.NewQuery("person",
                func(initialValue, sanitizedValue, validatorName string) string {
                    return "Please enter your name."
                },
            ).Chain().
                Not().
                Empty(nil).
                Validate(),
            func(ctx *gin.Context) {
                result, err := gv.ValidationResult(ctx)
                if err != nil {
                    ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
                        "message": "The server encountered an unexpected error.",
                    })
                    return
                }
    
                if len(result) != 0 {
                    ctx.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
                        "errors": result,
                    })
                    return
                }
    
                person := ctx.Query("person")
                ctx.String(http.StatusOK, "Hello, %s!", person)
            })
    
        r.Run()
    }
    
    Salin selepas log masuk
  • Medan kuki ialah kuki HTTP dan nilainya secara automatik tidak dapat dielakkan oleh Gin.

    Contoh:

    • Medan: "id_session", Nilai: "abc 123"
    {
      "errors": [
        {
          "location": "queries",
          "message": "Please enter your name.",
          "field": "person",
          "value": ""
        }
      ]
    }
    
    Salin selepas log masuk

Menyesuaikan pengesah ekspres

Jika pelayan yang anda bina hanyalah pelayan yang sangat mudah, anda memerlukan pengesah, sanitizer dan mesej ralat selain daripada yang terbina dalam ginvalidator lambat laun.

Pengesah dan Sanitizer Tersuai

Keperluan klasik yang tidak dapat dipenuhi oleh ginvalidator untuk anda, dan yang mungkin anda hadapi, adalah mengesahkan sama ada alamat e-mel sedang digunakan atau tidak semasa pengguna mendaftar.

Ini boleh dilakukan dalam ginvalidator dengan melaksanakan pengesah tersuai.

CustomValidator ialah kaedah yang tersedia pada rantaian pengesahan, yang menerima fungsi khas CustomValidatorFunc dan perlu mengembalikan boolean yang akan menentukan sama ada medan itu sah atau tidak.

CustomSanitizer juga merupakan kaedah yang tersedia pada rantaian pengesahan, yang menerima fungsi khas CustomSanitizerFunc, dan perlu mengembalikan nilai bersih yang baharu.

Melaksanakan pengesah tersuai

Pengesah Tersuai boleh menjadi tak segerak dengan menggunakan goroutin dan penyegerakan.WaitGroup untuk mengendalikan operasi serentak. Dalam pengesah, anda boleh memutarkan gorout untuk setiap tugas tak segerak, menambah setiap tugas pada WaitGroup. Setelah semua tugasan selesai, pengesah harus mengembalikan boolean.

Sebagai contoh, untuk menyemak sama ada e-mel tidak digunakan:

go mod init example.com/learning
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Atau mungkin anda juga boleh mengesahkan bahawa kata laluan sepadan dengan ulangan:

go get -u github.com/gin-gonic/gin
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

⚠️ Awas:
Jika badan permintaan akan diakses berbilang kali—sama ada dalam rantaian pengesahan yang sama, dalam rantaian pengesahan lain untuk konteks permintaan yang sama atau dalam pengendali seterusnya—pastikan anda menetapkan semula badan permintaan selepas setiap kali dibaca. Kegagalan berbuat demikian boleh menyebabkan ralat atau kehilangan data apabila kandungan dibaca semula.

Melaksanakan sanitizer tersuai

CustomSanitizer tidak mempunyai banyak peraturan. Walau apa pun nilai yang mereka pulangkan, adalah nilai baharu yang akan diperolehi oleh medan tersebut.
Pembersih tersuai juga boleh tidak segerak dengan menggunakan goroutin dan penyegerakan.WaitGroup untuk mengendalikan operasi serentak.

go get -u github.com/bube054/ginvalidator
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mesej Ralat

Apabila nilai medan tidak sah, mesej ralat direkodkan untuknya.
Mesej ralat lalai ialah "Nilai tidak sah", yang tidak menggambarkan sama sekali tentang ralat itu, jadi anda mungkin perlu menyesuaikannya. Anda boleh menyesuaikan dengan

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • initialValue ialah nilai asal yang diekstrak daripada permintaan (sebelum sebarang sanitasi).
  • sanitizedValue ialah nilai selepas ia dibersihkan (jika berkenaan).
  • validatorName ialah nama pengesah yang gagal, yang membantu mengenal pasti peraturan pengesahan yang tidak lulus.

Untuk senarai lengkap nama pengesah, rujuk pemalar ginvalidator.

Penyelenggara

  • bube054 - Attah Gbubemi David (pengarang)

Atas ialah kandungan terperinci Permudahkan Pengesahan Input Gin dalam Go dengan ginvalidator. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
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 terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan