参数校验主要用于校验前端提交参数的合法性和合理性,当前有很多开源校验框架,事实上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.1 restgo后台管理框架
https://github.com/winlion/restgo-admin
10.2 天天任务清单小程序
https://github.com/winlion/dailytask
10.3 工业大数据采集
10.4 restgo cms
10.5 restgo 千人大群
golang实战使用gin+xorm搭建go语言web框架restgo详解1.1 go语言的困境
golang实战使用gin+xorm搭建go语言web框架restgo详解1.2 我要做什么
golang实战使用gin+xorm搭建go语言web框架restgo详解2 框架基本架构
golang实战使用gin+xorm搭建go语言web框架restgo详解3 系统常用配置参数
golang实战使用gin+xorm搭建go语言web框架restgo详解4 路由配置
golang实战使用gin+xorm搭建go语言web框架restgo详解5 控制器C
golang实战使用gin+xorm搭建go语言web框架restgo详解5.2 跳转和重定向
golang实战使用gin+xorm搭建go语言web框架restgo详解5.3 资源控制器
golang实战使用gin+xorm搭建go语言web框架restgo详解5.4 控制器参数绑定
golang实战使用gin+xorm搭建go语言web框架restgo详解5.5 控制器模型绑定
golang实战使用gin+xorm 搭建 go语言web框架restgo搭建详解5.6 控制器参数校验
Golang go语言整合gin+xorm 搭建 web框架restgo搭建详解5.7 控制器数据响应
golang实战使用gin+xorm搭建go语言web框架restgo详解5.9 控制器controller编程
golang实战使用gin+xorm搭建go语言web框架restgo详解6.1 模型M和Orm
golang实战使用gin+xorm搭建go语言web框架restgo详解6.4 推荐编程方式
golang实战使用gin+xorm搭建go语言web框架restgo详解7 视图层V
golang实战使用gin+xorm搭建go语言web框架restgo详解8 关于模板
golang实战使用gin+xorm搭建go语言web框架restgo详解9 session、日志、鉴权
作者简介:胡文林,持续创业者,长期从事技术开源工作。微信号jiepool-winlion