From 7c67160c65ba76e18918dd319bb15c578691f7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 7 Feb 2025 18:01:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= =?UTF-8?q?,=20=E9=BB=98=E8=AE=A4tag=3Derr,=20=E6=94=AF=E6=8C=81=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E9=BB=98=E8=AE=A4tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/config.go | 25 +++++++++++++++++++ router/handler.go | 2 ++ router/register_test.go | 3 ++- router/validator.go | 55 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 router/config.go create mode 100644 router/validator.go diff --git a/router/config.go b/router/config.go new file mode 100644 index 0000000..57e6d89 --- /dev/null +++ b/router/config.go @@ -0,0 +1,25 @@ +// Package router ... +// +// Description : router ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-02-07 17:41 +package router + +import "strings" + +var defaultValidateErrTag = "err" + +// SetValidateErrTag 设置验证失败时, 获取错误信息的tag字段 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:42 2025/2/7 +func SetValidateErrTag(tagName string) { + tagName = strings.TrimSpace(tagName) + if tagName == "" { + return + } + defaultValidateErrTag = tagName +} diff --git a/router/handler.go b/router/handler.go index e76a410..ce791f3 100644 --- a/router/handler.go +++ b/router/handler.go @@ -31,6 +31,8 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { formData := reflect.New(uriCfg.FormDataType).Interface() // 表单解析 if err = request.Form.Parse(ctx, formData); nil != err { + // 格式化验证错误的信息 + err = GetValidateErr(formData, err) e = exception.NewFromError(400, err) response.SendWithException(ctx, e, nil) return diff --git a/router/register_test.go b/router/register_test.go index b19a439..6bbedd8 100644 --- a/router/register_test.go +++ b/router/register_test.go @@ -21,7 +21,7 @@ func (t TestController) Logic(ctx *gin.Context, formData *TestForm) (any, error) type TestForm struct { Meta `tag:"测试表单" path:"/a/b/c/d" desc:"测试接口" method:"get"` - Age int `json:"age" form:"age" binding:"min=20"` + Age int `json:"age" form:"age" binding:"min=20" err_msg:"年龄不能小于20"` Name string `json:"name" form:"name"` Test *Test `json:"test" form:"test"` Num *int64 `json:"num" form:"num"` @@ -31,6 +31,7 @@ type Test struct { } func Test_parseController(t *testing.T) { + SetValidateErrTag("err_msg") r := gin.Default() Group(r, "test", nil, TestController{}) r.Run(":8080") diff --git a/router/validator.go b/router/validator.go new file mode 100644 index 0000000..92602f0 --- /dev/null +++ b/router/validator.go @@ -0,0 +1,55 @@ +// Package router ... +// +// Description : router ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-02-07 17:36 +package router + +import ( + "errors" + "fmt" + "github.com/go-playground/validator/v10" + "reflect" + "strings" +) + +// GetValidateErr 格式化错误信息 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:19 2025/1/15 +func GetValidateErr(obj any, rawErr error) error { + if nil == rawErr { + return nil + } + if nil == obj { + return rawErr + } + var ( + ok bool + validationErrs validator.ValidationErrors + errString []string + field reflect.StructField + ) + if ok = errors.As(rawErr, &validationErrs); !ok { + return rawErr + } + objType := reflect.TypeOf(obj) + if objType.Kind() == reflect.Ptr { + objType = objType.Elem() + } + for _, validationErr := range validationErrs { + if field, ok = objType.FieldByName(validationErr.Field()); ok { + if e := field.Tag.Get(defaultValidateErrTag); e != "" { + errString = append(errString, fmt.Sprintf("%s: %s", field.Tag.Get("json"), e)) + continue + } else { + errString = append(errString, fmt.Sprintf("%s: %v", field.Tag.Get("json"), validationErr.Value())) + } + } + errString = append(errString, validationErr.Error()) + } + return errors.New(strings.Join(errString, "\n")) +}