gin框架 数据验证validator 并输出中文报错信息

4 篇文章 1 订阅

一、使用validator根据需求需要稍做调整

1.需要说明的是,gin框架有自己的验证包,我们也可以用第三方的验证包,不过都差不多,在我们进行项目开发中,有如下几个问题:

        1)、同时返回多个字段的错误,可通过遍历错误信息,只返回一条

        2)、返回的错误信息为英文的,要转译成中文

        3)、对应错误信息的字段名称为英文,需要转为中文

二、需要下载的包

	"github.com/go-playground/locales/zh_Hans_CN"
	unTrans "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"

如上的包,通过 go get 获取

三、封装验证方法

package validator

import (
	"fmt"
	"github.com/go-playground/locales/zh_Hans_CN"
	unTrans "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

func Validate(data interface{}) (string,int) {
	//验证对象 并将英文报错转换成中文报错(message)
	validate := validator.New()
	uni := unTrans.New(zh_Hans_CN.New())
	trans,_ := uni.GetTranslator("zh_Hans_CN")
	err := zhTrans.RegisterDefaultTranslations(validate,trans)
	if err != nil {
		fmt.Println("err:",err)
	}
	//将验证法字段名 映射为中文名
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})
	err = validate.Struct(data)
	if err != nil {
		//错误可能有多个 遍历 返回一个
		for _,v := range err.(validator.ValidationErrors) {
			return v.Translate(trans),500
		}
	}
	return "",200
}

四、使用验证

json : json转换字段名

validate:验证规则

label:字段名对应的 中文名

// 表单数据 需要tag参数

type User struct {
	UserName string `json:"username" validate:"required,min=4,max=12" label:"用户名"`
	PassWord string `json:"password" validate:"required,min=6,max=20" label:"密码"`
}

控制器中使用validator

func AddUser(c *gin.Context) {

	var data models.User

    //接收请求参数
	_ = c.ShouldBindJSON(&data) 

    //验证数据并返回结果
	msg,code := validator.Validate(&data)
    
    //验证报错,返回错误信息给前端
	if code != 200 {
		c.JSON(http.StatusOK,gin.H{
			"status":code,
			"message":msg,
		})
		return
	}

}

测试请求结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gin 框架中,使用 `binding` 标签可以对表单输入进行验证。下面是一个 Gin 框架表单输入验证器的使用示例: 1. 导入 gin 包 ``` import "github.com/gin-gonic/gin" ``` 2. 创建一个结构体,定义表单输入 ``` type LoginForm struct { Username string `form:"username" binding:"required"` Password string `form:"password" binding:"required"` } ``` 3. 在路由处理函数中使用验证器 ``` func loginHandler(c *gin.Context) { var form LoginForm if err := c.ShouldBind(&form); err != nil { c.HTML(http.StatusBadRequest, "login.html", gin.H{ "error": err.Error(), }) return } // TODO: 处理登录逻辑 } ``` 4. 创建一个 HTML 模板,定义表单 ``` <!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> {{ if .error }} <p style="color: red;">{{ .error }}</p> {{ end }} <form method="POST" action="/login"> <label for="username">Username:</label> <input type="text" name="username" id="username"><br> <label for="password">Password:</label> <input type="password" name="password" id="password"><br> <input type="submit" value="Login"> </form> </body> </html> ``` 5. 启动服务 ``` func main() { r := gin.Default() r.LoadHTMLGlob("templates/*") r.GET("/login", func(c *gin.Context) { c.HTML(http.StatusOK, "login.html", gin.H{}) }) r.POST("/login", loginHandler) r.Run(":8080") } ``` 这样,当用户提交登录表单时,会先对表单输入进行校验,如果输入不符合要求,则返回错误信息;如果输入符合要求,则继续处理登录逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值