Gin JSON数据绑定和参数验证以及自定义验证的错误信息

Posted jiangxiaoju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gin JSON数据绑定和参数验证以及自定义验证的错误信息相关的知识,希望对你有一定的参考价值。

文章目录

原创不易,未经允许,请勿转载。

博客主页:https://xiaojujiang.blog.csdn.net/

一、JSON数据绑定

首先定义一个接受数据用的DTO结构体,叫做LoginDTO

type LoginDto struct 
	Username string `json:"username" binding:"required" msg:"用户名不能为空"`
	Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
	Email    string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`


几个tag的作用分别是:

注册路由,获取从请求体中获取获取参数

package main

import "github.com/gin-gonic/gin"


type LoginDto struct 
	Username string `json:"username" binding:"required" msg:"用户名不能为空"`
	Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
	Email    string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`


func main() 
	r := gin.Default()

	r.POST("/login", func(c *gin.Context) 
		userDto := &LoginDto // 要指针类型
		if err := c.ShouldBindJSON(userDto); err != nil 
			c.JSON(200, gin.H"message": err.Error())
		 else 
			c.JSON(200, gin.H
				"message": userDto,
			)
		
	)

	r.Run(":8080")



运行一下上面的代码,用postman传入下列参数测试一下


    "username":"1",
    "password":"jiang",
    "email":"test@qq.com"

返回的结果如果是下面这样,则代码没什么问题。


    "message": 
        "username": "1",
        "password": "jiang",
        "email": "test@qq.com"
    

二、参数验证

一些接口的参数需要满足特定的要求,例如username这个字段不能为空,也不能超过一定长度。如果要我们接受好参数再手动判断就太麻烦了,gin框架可以帮助我们在绑定参数的时候顺带的去验证参数是否符合我们的要求。
添加验证的方法也很简单。只要在tag中添加binding:"..."验证规则即可

type LoginDto struct 
	Username string `json:"username" binding:"required"`  // 表示该字段是必须的,不能为空
	Password string `json:"password" binding:"min=3,max=6"` // 如果该字段是字符串的话,长度不能小于3,不能大于6
	Email    string `json:"email" binding:"email"` // 该字段要符合邮箱地址

更多验证规则可以看这个文档 https://github.com/go-playground/validator,因为gin内部的验证也是引用的这个库。


三、自定义验证的错误信息

当验证不通过时,会给出错误的信息,但是原始的错误信息不太友好,不利于用户查看

Key: 'LoginDto.Username' Error:Field validation for 'Username' failed on the 'required' tag

所以当出现错误时,我们希望可以返回我们自定义的错误信息,这样方便调用方差错。
在结构体的字段中,添加一个msg的tag,表示提示信息,当该字段验证不通过时,就返回msg的提示

type LoginDto struct 
	Username string `json:"username" binding:"required" msg:"用户名不能为空"`
	Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
	Email    string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`


当出现错误时,就可以来获取出错字段上的msg。

  • err:这个参数为ShouldBindJSON返回的错误信息
  • obj:这个参数为绑定的结构体
  • 还有一点要注意的是,validator这个包要引用v10这个版本的,否则会出错
func GetValidMsg(err error, obj interface) string 
	getObj := reflect.TypeOf(obj)
	if errs, ok := err.(validator.ValidationErrors); ok 
		for _, e := range errs 
			if f, exist := getObj.Elem().FieldByName(e.Field()); exist 
				return f.Tag.Get("msg") //错误信息不需要全部返回,当找到第一个错误的信息时,就可以结束
			
		
	
	return err.Error()

完整的代码如下

package main

import (
	"fmt"
	"reflect"

	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
)


type LoginDto struct 
	Username string `json:"username" binding:"required" msg:"用户名不能为空"`
	Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
	Email    string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`


func GetValidMsg(err error, obj interface) string 
	fmt.Println("sherlock")
	getObj := reflect.TypeOf(obj)
	if errs, ok := err.(validator.ValidationErrors); ok 
		for _, e := range errs 
			if f, exist := getObj.Elem().FieldByName(e.Field()); exist 
				return f.Tag.Get("msg")
			
		
	
	return err.Error()


func main() 
	r := gin.Default()

	r.POST("/login", func(c *gin.Context) 
		userDto := &LoginDto
		if err := c.ShouldBindJSON(userDto); err != nil 
			c.JSON(200, gin.H
				"status":  "err",
				"message": GetValidMsg(err, userDto),
			)

		 else 
			c.JSON(200, gin.H
				"status":  "change",
				"message": userDto,
			)
		
	)
	r.Run(":8080")


用postman传入下列参数测试一下


    "username":"",
    "password":"jiang",
    "email":"test@qq.com"

会返回下列错误提示


    "message": "用户名不能为空",
    "status": "err"





拒绝白嫖从一键三连开始!

原创不易,未经允许,请勿转载。

博客主页:https://xiaojujiang.blog.csdn.net/

以上是关于Gin JSON数据绑定和参数验证以及自定义验证的错误信息的主要内容,如果未能解决你的问题,请参考以下文章

Gin JSON数据绑定和参数验证以及自定义验证的错误信息

gin-数据绑定+数据验证

gin框架自定义验证错误提示信息

基于gin的golang web开发:模型验证

10gin快速入门

Gin框架04:趣谈参数绑定与校验