最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang驗(yàn)證器之validator是使用詳解

 更新時(shí)間:2022年08月25日 11:34:11   作者:yi個(gè)俗人  
Validator是一個(gè)?Golang?的第三方庫(kù),用于對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),常用于?API?的開(kāi)發(fā)中,對(duì)客戶端發(fā)出的請(qǐng)求數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn),防止惡意請(qǐng)求。本文通過(guò)示例詳細(xì)講解了Validator的使用,需要的可以參考一下

前言

對(duì)于HTTP請(qǐng)求,我們要在腦子里有一個(gè)根深蒂固的概念,那就是任何客戶端傳過(guò)來(lái)的數(shù)據(jù)都是不可信任的。那么開(kāi)發(fā)接口的時(shí)候需要對(duì)客戶端傳提交的參數(shù)進(jìn)行參數(shù)校驗(yàn),如果提交的參數(shù)只有一個(gè)兩個(gè),這樣我們可以簡(jiǎn)單寫個(gè)if判斷,那么要是有很多的參數(shù)校驗(yàn),那么滿屏都是參數(shù)校驗(yàn)的if判斷,效率不僅低還不美觀,接下來(lái)我們介紹一個(gè)參數(shù)校驗(yàn)器validator。

什么是validator

Validator 是一個(gè) Golang 的第三方庫(kù),用于對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),常用于 API 的開(kāi)發(fā)中,對(duì)客戶端發(fā)出的請(qǐng)求數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn),防止惡意請(qǐng)求。

安裝

validator包安裝:

go get -u github.com/go-playground/validator/v10

使用方法

導(dǎo)入validator:

import "github.com/go-playground/validator/v10"

validator 應(yīng)用了 GolangStruct Tag Reflect機(jī)制,基本思想是:在 Struct Tag 中為不同的字段定義各自類型的約束,然后通過(guò) Reflect 獲取這些約束的類型信息并在校驗(yàn)器中進(jìn)行數(shù)據(jù)校驗(yàn)。

示例:

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	UserName string `json:"user_name" validate:"required"`
	Password string `json:"password" validate:"required,min=6,max=20"`
}
func main() {
	example := User{
		Password: "123",
	}
 
	//實(shí)例化驗(yàn)證器
	validate  := validator.New() 

	errs := validate.Struct(example)
	if errs != nil {
		for _, err := range errs.(validator.ValidationErrors) {
			fmt.Println(err)
		}
	}

}

validator包的驗(yàn)證提示默認(rèn)是英文的,輸出如下:

這樣看可能不太清楚,如果需要翻譯成中文則還需安裝驗(yàn)證提示翻譯包:

go get -u github.com/go-playground/locales
go get -u github.com/go-playground/universal-translator

修改后如下:

package main

import (
	"fmt"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zh_translations "github.com/go-playground/validator/v10/translations/zh"
)

type User struct {
	UserName string `json:"user_name" validate:"required"`
	Password string `json:"password" validate:"required,min=6,max=20"`
}
func main() {
	example := User{
		Password: "123",
	}
	// 中文翻譯器
	uni := ut.New(zh.New())
	trans, _ := uni.GetTranslator("zh")

	//實(shí)例化驗(yàn)證器
	validate  := validator.New()
	// 注冊(cè)翻譯器到校驗(yàn)器
	err := zh_translations.RegisterDefaultTranslations(validate, trans)
	if err!=nil {
		fmt.Println(err)
		return
	}

	errs := validate.Struct(example)
	if errs != nil {
		for _, err := range errs.(validator.ValidationErrors) {
			fmt.Println(err.Translate(trans))
		}
	}

}

執(zhí)行輸出:

校驗(yàn)規(guī)則

下面列舉一部分我們開(kāi)發(fā)中經(jīng)常用到的驗(yàn)證規(guī)則,詳細(xì)驗(yàn)證規(guī)則可以參考文檔:

https://pkg.go.dev/gopkg.in/go-playground/validator.v10

Tag說(shuō)明示例
required必填Field或Struct validate:"required"
omitempty空時(shí)忽略Field或Struct validate:"omitempty"
len長(zhǎng)度Field validate:"len=0"
eq等于Field validate:"eq=0"
gt大于Field validate:"gt=0"
gte大于等于Field validate:"gte=0"
lt小于Field validate:"lt=0"
lte小于等于Field validate:"lte=0"
min最小值Field validate:"min=1"
max最大值Field validate:"max=2"
required_with其他字段其中一個(gè)不為空且當(dāng)前字段不為空Field validate:"required_with=Field1 Field2"
required_without其他字段其中一個(gè)為空且當(dāng)前字段不為空Field `validate:“required_without=Field1 Field2”
lowercase符串值是否只包含小寫字符Field validate:"lowercase"
uppercase符串值是否只包含大寫字符Field validate:"uppercase"
email字符串值包含一個(gè)有效的電子郵件Field validate:"email"
json字符串值是否為有效的JSONField validate:"json"
url符串值是否包含有效的urlField validate:"url"
uri符串值是否包含有效的 uriField validate:"uri"
contains字符串值包含子字符串值Field validate:"contains=@"
excludes字符串值不包含子字符串值字符串值不包含子字符串值 Field validate:"excludes=@"
ip字符串值是否包含有效的 IP 地址Field validate:"ip"
datetime字符串值是否包含有效的日期Field validate:"datetime"
startswith字符串以提供的字符串值開(kāi)始Field validate:"startswith=abc"
endswith字符串以提供的字符串值結(jié)束Field validate:"endswith=abc"

跨字段驗(yàn)證

validator 允許定義跨字段驗(yàn)證,即:驗(yàn)證某個(gè)字段與其他字段之間的關(guān)系。這種驗(yàn)證實(shí)際上分為兩種:

  • 一種是參數(shù)字段就是同一個(gè)結(jié)構(gòu)體中的平級(jí)字段。
  • 另一種是參數(shù)字段為結(jié)構(gòu)中其他字段的字段。

驗(yàn)證語(yǔ)法很簡(jiǎn)單,如果是驗(yàn)證同一個(gè)結(jié)構(gòu)中的字段,則在基礎(chǔ)的 Tags 后面添加一個(gè) field 后綴,例如:eqfield 定義字段間的相等(eq)約束。如果是更深層次的字段,在 field 之前還需要加上 cs(Cross-Struct),eq 就變?yōu)榱?eqcsfield。

  • eqfield=Field:必須等于 Field 的值。
  • nefield=Field:必須不等于 Field 的值。
  • gtfield=Field:必須大于 Field 的值。
  • gtefield=Field: 必須大于等于 Field 的值。
  • ltfield=Field:必須小于 Field 的值。
  • ltefield=Field:必須小于等于 Field 的值。
  • eqcsfield=Other.Field:必須等于 struct Other 中 Field 的值。
  • necsfield=Other.Field:必須不等于 struct Other 中 Field 的值。
  • gtcsfield=Other.Field:必須大于 struct Other 中 Field 的值;
  • gtecsfield=Other.Field:必須大于等于 struct Other 中 Field 的值。
  • ltcsfield=Other.Field:必須小于 struct Other 中 Field 的值。
  • ltecsfield=Other.Field:必須小于等于 struct Other 中 Field 的值。

另外還有幾個(gè)常用的 Tag:

  • required_with=Field1 Field2:在 Field1 或者 Field2 存在時(shí),必須;
  • required_with_all=Field1 Field2:在 Field1 與 Field2 都存在時(shí),必須;
  • required_without=Field1 Field2:在 Field1 或者 Field2 不存在時(shí),必須;
  • required_without_all=Field1 Field2:在 Field1 與 Field2 都存在時(shí),必須;

錯(cuò)誤處理

通過(guò)看源碼,我們可以看到validator 返回的錯(cuò)誤有兩種,一種是參數(shù)錯(cuò)誤,一種是校驗(yàn)錯(cuò)誤,它們都實(shí)現(xiàn)了 error 接口。

  • 參數(shù)錯(cuò)誤時(shí),返回 InvalidValidationError 類型;
  • 校驗(yàn)錯(cuò)誤時(shí),返回 ValidationErrors 類型。ValidationErrors 是一個(gè)錯(cuò)誤切片,保存了每個(gè)字段違反的每個(gè)約束信息。

所以 validator 校驗(yàn)返回的結(jié)果有 3 種情況:

  • nil:沒(méi)有錯(cuò)誤;
  • InvalidValidationError:輸入?yún)?shù)錯(cuò)誤;
  • ValidationErrors:字段違反約束。

validator 返回的錯(cuò)誤有兩種,一種是參數(shù)錯(cuò)誤,一種是校驗(yàn)錯(cuò)誤,它們都實(shí)現(xiàn)了 error 接口。

參數(shù)錯(cuò)誤時(shí),返回 InvalidValidationError 類型;

校驗(yàn)錯(cuò)誤時(shí),返回 ValidationErrors 類型。ValidationErrors 是一個(gè)錯(cuò)誤切片,保存了每個(gè)字段違反的每個(gè)約束信息。

所以 validator 校驗(yàn)返回的結(jié)果只有 3 種情況:

nil:沒(méi)有錯(cuò)誤;

InvalidValidationError:輸入?yún)?shù)錯(cuò)誤;

ValidationErrors:字段違反約束。

我們可以在程序中判斷 err != nil 時(shí),可以依次將 err轉(zhuǎn)換為 InvalidValidationErrorValidationErrors 以獲取更詳細(xì)的信息:

err := validate.Struct(user)
if err != nil {
    invalid, ok := err.(*validator.InvalidValidationError)
      if ok {
        fmt.Println("param error:", invalid)
        return
    }
    
    validationErrs := err.(validator.ValidationErrors)
    for _, validationErr := range validationErrs {
        fmt.Println(validationErr)
    }
}

小結(jié)

通過(guò)以上的內(nèi)容我們了解了validator一些基本的功能和用法,在我們開(kāi)發(fā)中大大提高了開(kāi)發(fā)效率。

validator功能非常豐富,使用較為簡(jiǎn)單方便。它的應(yīng)用非常廣泛,建議了解一下。

到此這篇關(guān)于Golang驗(yàn)證器之validator是使用詳解的文章就介紹到這了,更多相關(guān)Golang validator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過(guò)程

    Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過(guò)程

    Go語(yǔ)言是Google的開(kāi)源編程語(yǔ)言,廣泛應(yīng)用于云計(jì)算、分布式系統(tǒng)開(kāi)發(fā)等領(lǐng)域,在Linux上也有大量的應(yīng)用場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 代碼整潔利器go?fmt命令使用詳解

    代碼整潔利器go?fmt命令使用詳解

    這篇文章主要為大家介紹了代碼整潔利器go?fmt命令使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang實(shí)現(xiàn)ping命令的完整代碼

    golang實(shí)現(xiàn)ping命令的完整代碼

    這篇文章給大家介紹了如何使用golang實(shí)現(xiàn)ping命令,文中給大家介紹了完整的實(shí)現(xiàn)代碼,并有詳細(xì)的圖文講解,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Go語(yǔ)言使用Request,Response處理web頁(yè)面請(qǐng)求

    Go語(yǔ)言使用Request,Response處理web頁(yè)面請(qǐng)求

    這篇文章主要介紹了Go語(yǔ)言使用Request,Response處理web頁(yè)面請(qǐng)求,需要的朋友可以參考下
    2022-04-04
  • 深入理解golang的異常處理機(jī)制

    深入理解golang的異常處理機(jī)制

    Go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種異常,下面這篇文章主要給大家介紹了關(guān)于golang的異常處理機(jī)制,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之import導(dǎo)包和初始化詳解,需要的朋友可以參考下
    2022-04-04
  • go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析

    go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼

    golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼

    這篇文章主要給大家介紹了關(guān)于golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Golang爬蟲(chóng)框架colly使用淺析

    Golang爬蟲(chóng)框架colly使用淺析

    這篇文章主要介紹了Golang爬蟲(chóng)框架colly的使用,colly是Go實(shí)現(xiàn)的比較有名的一款爬蟲(chóng)框架,而且Go在高并發(fā)和分布式場(chǎng)景的優(yōu)勢(shì)也正是爬蟲(chóng)技術(shù)所需要的,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)

    gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)

    這篇文章主要為大家介紹了gin框架Context?Get?Query?Param函數(shù)獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

太仆寺旗| 周宁县| 津南区| 保定市| 榆社县| 博爱县| 武威市| 高邮市| 绿春县| 嘉义县| 隆昌县| 涟源市| 新邵县| 涪陵区| 永吉县| 阜宁县| 普兰县| 深水埗区| 乐亭县| 竹溪县| 铁岭县| 白河县| 元朗区| 滦南县| 兰考县| 宽城| 新晃| 全椒县| 涞源县| 大渡口区| 高淳县| 且末县| 百色市| 乐至县| 长沙县| 平泉县| 文安县| 石屏县| 曲松县| 石台县| 邻水|