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