gin 自定义绑定器以及错误信息
type Astudent struct { StuName string `json:"name" binding:"required" msg:"学生姓名错误"` StuNumber int `json:"number" binding:"required" msg:"学号校验失败"` //自定义绑定器 class StuClass string `json:"class" binding:"required,class" msg:"请使用培优系统"` }
class是自定义的绑定器,msg是自定义的错误信息。以下是class绑定器:
func class(c validator.FieldLevel) bool { class := c.Field().Interface().(string) classStr := strings.Contains(class, "splendid") if classStr { return false } return true }
class将判断传回的Stuclass值是否包含splendid字符串,如果包含那么返回false
重写ShouldBind
import ( "errors" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" "reflect" ) type Api struct { Context *gin.Context Success bool `json:"success"` Code int `json:"code"` Data any `json:"data"` Message string `json:"message"` Timestamp int64 `json:"timestamp"` } func (e *Api) ShouldBindJSON(c *gin.Context, data any) error { //绑定json到结构体 err := c.ShouldBindJSON(data) if err != nil { getObj := reflect.TypeOf(data) //将err断言为validator.ValidationErrors类型 if errs, ok := err.(validator.ValidationErrors); ok { for _, er := range errs { if f, exist := getObj.Elem().FieldByName(er.Field()); exist { msg := f.Tag.Get("msg") return errors.New(msg) } } } } return nil }
在post请求中处理自定义错误信息:
type Portrait struct { api.Api } func (e Portrait) GenerateCompanyPortrait(c *gin.Context) { var req Astudent if err := e.ShouldBindJSON(c, &req); err != nil { e.MakeContext(c).Wrong("数据验证失败," + err.Error()) return } srv := server.Portrait{} companyPortrait, err := srv.GenerateCompanyPortrait(req) if err != nil { e.MakeContext(c).Wrong("生成失败," + err.Error()) return } e.MakeContext(c).OK(companyPortrait) }
可以将msg提示的错误信息打印。