Gin 参数绑定和校验精简版

Gin 参数绑定和校验

说明

在gin框架中我们需要对请求提交过来的参数进行合法性校验,那很多开发者在判断参数是否合法校验时会写很多if else逻辑,如果参数非常多,那么这样写起来非常不优雅,那么优雅的方式是什么呢?请看以下代码注释。

代码

entity.go

// 接受验证码参数struct
type VerifyCodeParams struct {
 Uid          int    `json:"uid"`
 CountryCode  string `form:"country_code" json:"country_code"`
 Phone        string `form:"phone" json:"phone"`
}

// 编写实现Valid方法,对参数结构体各个属性进行合法校验
func (t *VerifyCodeParams) Valid(v *validation.Validation) {
 if t.Uid <= 0 {
  if len(t.CountryCode) < 2 { // 校验CountryCode属性
   v.SetError("CountryCode""国际码不能少于2位")
  }
  if len(t.Phone) < 11 { // 校验手机号码
   v.SetError("Phone""手机号不能少于11位")
  }
 }
}

handler.go

handler接受api请求,参数绑定到VerifyCodeParams上
func QueryVerifyCodeHandler(c *gin.Context) {
 var form entity.VerifyCodeParams
 value, exist := c.Get("uid")
 if exist {
  uid, ok := value.(int)
  if !ok {
   app.JsonResponse(c, http.StatusOK, code.ErrorTokenEmpty, nil)
   return
  }
  form.Uid = uid
 }
  
 var err error
  
 // 绑定参数 & 校验参数
 err = BindAndValid(c, &form)
 if err != nil {
  app.JsonResponse(c, http.StatusOK, code.InvalidParams, err.Error())
  return
 }
  
 retCode, verifyCode := service.GenerateVerifyCode(c, &form)
 app.JsonResponse(c, http.StatusOK, retCode, verifyCode)
}

// 绑定和校验
func BindAndValid(c *gin.Context, form interface{}) error {
 if err := c.Bind(form); err != nil { //绑定
  return err
 }
 valid := validation.Validation{}
 ok, err := valid.Valid(form) // 校验
 if err != nil {
  return err
 }
 if !ok {
  markErrors(c, valid.Errors)
  return buildFormErr(valid.Errors)
 }
 return nil
}

小结

把参数绑定和校验放在一个函数中,这样写比较优雅和清晰,防止handler中大段if else代码,不美观,不优雅。

validation参考:https://github.com/cnxkey/beego/blob/master/validation


原文始发于微信公众号(堆栈future):Gin 参数绑定和校验精简版

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103523.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!