Gin Tag
Gin 参数验证;主流方法:
"github.com/gin-gonic/gin/binding"
Gin自带校验器"github.com/go-playground/validator/v10"
「规则丰富」,推荐
Gin 参数绑定类型
常用的参数绑定类型有:
- Form:
-
- form表单;绑定 (
application/x-www-form-urlencoded和multipart/form-data)
- form表单;绑定 (
-
- 处理来自 HTML 表单的数据。
-
- 通常用于处理用户提交的表单数据,如登录信息、用户注册信息等。
-
- 也用于文件上传(使用
multipart/form-data)
- 也用于文件上传(使用
- Json:
-
- 用于处理 JSON 格式的请求体。
-
- 常见于 RESTful API,处理客户端发送的 JSON 数据。
-
- 适合处理复杂结构的数据。
- Query:URL查询参数
-
- 用于处理 URL 中的查询字符串参数。
-
- 适用于 GET 请求,其中数据包含在 URL 中。
-
- 常用于搜索、过滤数据等场景。
- URI 绑定
-
- 用于处理 URL 路径中的参数。
-
- 常用于 RESTful 路径,如
/users/:id。
- 常用于 RESTful 路径,如
-
- 适用于需要从 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 中。如果字段不存在,则
IsTrue为nil。 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
- 所有单词首字母大写