gin 自定义绑定器以及错误信息

作者: adm 分类: go 发布时间: 2025-01-29
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提示的错误信息打印。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!