赞
踩
参数校验主要用于校验前端提交参数的合法性和合理性,当前有很多开源校验框架,事实上gin集成了go-playground/validator.vx 作为校验插件,当前最新版本是v9,详细文档见https://godoc.org/gopkg.in/go-playground/validator.v9
go-playground/validator.vx 功能非常强大,不但内置了丰富的校验方法如email/url/base64/required等,用户也可以自定义校验。
//使用内置校验示例
func (ctrl *TestController)query(ctx *gin.Context){
var pageArg model.PageArg
ctx.ShouldBindJSON(&pageArg)
err := validator.New().Struct(&pageArg)
if err != nil {
// this check is only needed when your code could produce
// an invalid value for validation such as interface with nil
// value most including myself do not usually have code like this.
if _, ok := err.(*validator.InvalidValidationError); ok {
fmt.Println(err)
return
}
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err.Namespace())
fmt.Println(err.Field())
fmt.Println(err.StructNamespace()) // can differ when a custom TagNameFunc is registered or
fmt.Println(err.StructField()) // by passing alt name to ReportError like below
fmt.Println(err.Tag())
fmt.Println(err.ActualTag())
fmt.Println(err.Kind())
fmt.Println(err.Type())
fmt.Println(err.Value())
fmt.Println(err.Param())
fmt.Println()
}
// from here you can create your own error messages in whatever language you wish
//return
}
restgo.ResultOk(ctx,err)
}
校验的其他示例可以参考
https://github.com/go-playground/validator/tree/v9/_examples
事实上,我们推荐使用自定义校验方案,因为自定义校验处理更灵活,交互体验更友好。
具体示例如下
type PageArg struct {
Kword string `form:"kword"`
Datefrom time.Time `form:"datefrom" time_format:"2006-01-02 15:04:05"`
Dateto time.Time `form:"dateto" time_format:"2006-01-02 15:04:05"`
Pagesize int `form:"pagesize" json:"pagesize"`
Pagefrom int `form:"pagefrom" json:"pagefrom" validate:"gte=0"`
Desc string `form:"desc" json:"desc"`
Asc string `form:"asc" json:"asc"`
}
func (p* PageArg)Validate() (bool,error){
if p.Datefrom.IsZero() {
return false,errors.New("请输入开始时间")
}
if p.Pagesize>100 {
return false,errors.New("一次只能请求100条数据")
}
if p.Pagefrom<0 {
return false,errors.New("分页参数错误")
}
return true,nil
}
//请求示例 ctx.ShouldBindJSON(&pageArg) bindok,err := pageArg.Validate() if !bindok{ restgo.ResultFail(ctx,err) }
本文源代码源代码获取地址 https://github.com/winlion/restgo
10.2 天天任务清单小程序
https://github.com/winlion/dailytask
10.3 工业大数据采集
10.4 restgo cms
10.5 restgo 千人大群
作者简介:胡文林,持续创业者,长期从事技术开源工作。微信号jiepool-winlion
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。