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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6w9uR3RUINjPcIwLVAuNzw