Golang Struct&Tag及参数binding与validator校验器使用

146 阅读3分钟

Gin Tag

Gin 参数验证;主流方法:

"github.com/gin-gonic/gin/binding" Gin自带校验器

"github.com/go-playground/validator/v10"「规则丰富」,推荐

Gin 参数绑定类型

常用的参数绑定类型有:

  • Form:
    • form表单;绑定 (application/x-www-form-urlencodedmultipart/form-data)
    • 处理来自 HTML 表单的数据。
    • 通常用于处理用户提交的表单数据,如登录信息、用户注册信息等。
    • 也用于文件上传(使用 multipart/form-data
  • Json:
    • 用于处理 JSON 格式的请求体。
    • 常见于 RESTful API,处理客户端发送的 JSON 数据。
    • 适合处理复杂结构的数据。
  • Query:URL查询参数
    • 用于处理 URL 中的查询字符串参数。
    • 适用于 GET 请求,其中数据包含在 URL 中。
    • 常用于搜索、过滤数据等场景。
  • URI 绑定
    • 用于处理 URL 路径中的参数。
    • 常用于 RESTful 路径,如 /users/:id
    • 适用于需要从 URL 路径中提取参数的场景。
  • Param:URL路径参数
  • Body:请求体中的JSON/XML等格式数据

Gin Struct Tag

我们直接使用validator校验器

binding和validator在写法上一致,都是使用binding Tag;区别validator规则更加丰富

validator校验器 示例1

type Body struct {
	Name string `json:"name" binding:"oneof=vk vksir" err:"one of vk,vksir"`
	Age  int    `json:"age" binding:"BodyAgeValidate" err:"only 18"`
}

validator校验器 示例2

type SSLCertificateCheckRequest struct {
	DomainName                 []string        `form:"domainName" binding:"required,dive,fqdn,min=1"` // dive校验每个分片元素不能为空
	OpenTracingContextWithSpan context.Context `form:"-"`
	PageNum                    int             `form:"pageNum,omitemptym"`
	PageSize                   int             `form:"pageSize,omitempty"`
	ForceUpdate                bool            `form:"forceUpdate,omitempty"`
	CacheQueryKey              string          `form:"-"` // 根据请求PATH构建缓存查询KEY
	GinContext                 *gin.Context    `form:"-"`
}

required 不能为空

dive 校验分片的元素

fqdn 域名规则

Gin 验证入参是否符合校验器规则

BindJson自动校验带tag的Struct即可

var (
		req = request.HGin{C: c}
		ppa rhandler.SSLCertificateCheckRequest
	)

	if err := c.BindJSON(&ppa); err != nil {
		req.FailResponse(err.Error())
		return nil, err
	}

其他常见validator校验器规则

string binding:"required,datetime=2006-01-02" 验证入参是否符合 YYYY-MM-DD
string binding:"required,datetime=2006-01" 验证入参是否符合 YYYY-MM

int `json:"test" binding:"min=1,max=100"` 验证是否>1 小于100;前端入参,类型为int

// 使用指针类型的布尔字段;这里允许为空,且若未传值为Nil,相当于置为默认值为false
IsTrue *bool `json:"isTrue" binding:"omitempty"` 

// 嵌套元素符合YYYY-MM-DD条件
[]string `json:"test" binding:"required,dive,datetime=2006-01-02"` 
  • IsTrue 字段是一个指向布尔值的指针。通过使用指针,可以区分字段是否存在于 JSON 中。如果字段不存在,则 IsTruenil
  • omitempty 标签用于指示该字段在绑定时可以被忽略,也就是说,它可以不存在于 JSON 请求中。
  • 在处理函数中,检查 IsTrue 是否为 nil,如果是,则将其视为 false
  • 使用指针类型的布尔字段提供了灵活性,允许你区分字段是否在 JSON 请求中显式提供,并根据实际需求适当处理字段的默认值。

其他Tag标记

tag:name 用于反射时

  • 建议:骆驼峰风格

tag:json 用于json输出

  • 建议:骆驼峰风格

  • 参数;omitempty 默认配置

  • "-";默认不输出

示例:

type XBillDetail struct {
	gorm.Model 

	BusinessCodeName string  `json:"businessCodeName,omitempty" name:"BusinessCodeName"`

	ComponentSet []XBillDetailComponent `json:"componentSet,omitempty" name:"ComponentSet" gorm:"foreignKey:ID"`
	
	Tags []XBillTagInfo `json:"tags,omitempty" name:"Tags" gorm:"foreignKey:ID"`

	PriceInfo []string `json:"priceInfo,omitempty" name:"PriceInfo"`
}
type XBillDetailComponent struct {
	gorm.Model 

	SpecifiedPrice string `json:"-" name:"SpecifiedPrice"`

	SPDeduction string `json:"-" name:"SPDeduction"`
}

常见命名风格:

骆驼峰 businessCodeName

  • 所有单词首字母大写「除第一个」

帕斯卡命名法 BusinessCodeName

  • 所有单词首字母大写

链接

blog.csdn.net/RS_zhengjie…

blog.csdn.net/K346K346/ar…

www.vksir.zone/posts/go_gi…