golang实战使用gin+xorm搭建go语言web框架restgo详解5.6 控制器参数校验

参数校验主要用于校验前端提交参数的合法性和合理性,当前有很多开源校验框架,事实上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.天天任务清单小程序

https://github.com/winlion/dailytask

10.工业大数据采集

10.restgo cms 

10.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


猜你喜欢

转载自blog.csdn.net/keytounix/article/details/79336589