首页 > 其他分享 >gin-表单验证

gin-表单验证

时间:2022-10-25 14:44:44浏览次数:30  
标签:return string err 验证 binding 表单 json gin

功能:

  1. 对登录和注册表单进行验证

  2. 对表单返回的错误进行中文翻译

  3. 对表单返回的数据进行处理,大小写处理和切割

package main

import (
	"fmt"
	"net/http"
	"reflect"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/locales/en"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	en_translations "github.com/go-playground/validator/v10/translations/en"
	zh_translations "github.com/go-playground/validator/v10/translations/zh"
)

var trans ut.Translator

type LoginForm struct {
	User     string `json:"user" binding:"required,min=3,max=10"`
	Password string `json:"password" binding:"required"`
}

type SignUpForm struct {
	//注册的表单验证
	Age        uint8  `json:"age" binding:"gte=1,lte=130"`
	Name       string `json:"name" binding:"required,min=3"`
	Email      string `json:"email" binding:"required,email"`
	Password   string `json:"password" binding:"required"`
	RePassword string `json:"re_password" binding:"required,eqfield=Password"` //跨字段
}

func removeTopStruct(fileds map[string]string) map[string]string {
	rsp := map[string]string{}
	for field, err := range fileds {
		rsp[field[strings.Index(field, ".")+1:]] = err
	}
	return rsp
}

func InitTrans(locale string) (err error) {
	//修改gin框架中的validator引擎属性, 实现定制
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		//注册一个获取json的tag的自定义方法
		v.RegisterTagNameFunc(func(fld reflect.StructField) string {
			name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
			if name == "-" {
				return ""
			}
			return name
		})

		zhT := zh.New() //中文翻译器
		enT := en.New() //英文翻译器
		//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境
		uni := ut.New(enT, zhT, enT)
		trans, ok = uni.GetTranslator(locale)
		if !ok {
			return fmt.Errorf("uni.GetTranslator(%s)", locale)
		}

		switch locale {
		case "en":
			en_translations.RegisterDefaultTranslations(v, trans)
		case "zh":
			zh_translations.RegisterDefaultTranslations(v, trans)
		default:
			en_translations.RegisterDefaultTranslations(v, trans)
		}
		return
	}

	return
}

func main() {
	//代码侵入性很强 中间件
	if err := InitTrans("zh"); err != nil {
		fmt.Println("初始化翻译器错误")
		return
	}
	router := gin.Default()
	router.POST("/loginJSON", func(c *gin.Context) {

		var loginForm LoginForm
		if err := c.ShouldBind(&loginForm); err != nil {
			errs, ok := err.(validator.ValidationErrors)
			if !ok {
				c.JSON(http.StatusOK, gin.H{
					"msg": err.Error(),
				})
			}
			c.JSON(http.StatusBadRequest, gin.H{
				"error": removeTopStruct(errs.Translate(trans)),
			})
			return
		}

		c.JSON(http.StatusOK, gin.H{
			"msg": "登录成功",
		})
	})

	router.POST("/signup", func(c *gin.Context) {
		var signUpFrom SignUpForm
		if err := c.ShouldBind(&signUpFrom); err != nil {
			fmt.Println(err.Error())
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
			return
		}

		c.JSON(http.StatusOK, gin.H{
			"msg": "注册成功",
		})
	})

	_ = router.Run(":8083")
}

  

标签:return,string,err,验证,binding,表单,json,gin
From: https://www.cnblogs.com/wlike/p/16824767.html

相关文章

  • Nginx简介和安装
    1简介Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄......
  • Webpack中的plugin插件机制
    大家有没有遇到过这些问题:webpack打包之后的文件没有压缩静态文件要手动拷贝到输出目录代码中写了很多环境判断的多余代码上一篇「webpack核心特性」loader说到......
  • Gin-JSON,ProtoBuf渲染
    1.输出json和protobuf新建user.proto文件 syntax="proto3";optiongo_package=".;proto";messageTeacher{stringname=1;repeatedstringcour......
  • CF838B Diverging Directions
    题目链接:​​传送门​​分析一下他给的这个图就知道一个祖先到它的儿子只有生成树的边可以走而一个儿子走到祖先有两种方法一个是先直接到1,再从1走到那个祖先还有一个很......
  • 使用docker部署nginx并配置https
     使用docker部署nginx并配置https 我只有一台服务器,但我想在这台服务器上运行多个项目,怎么办?总不能靠加端口区分吧?百度和Google是个好东西,于是我找到了答案,使用ng......
  • nginx反向代理harbor
    1、构建基础镜像#构建ubuntu系统基础镜像[root@DY-ubuntu-01ubuntu_base]#vimDockerfileFROMubuntu:20.04LABELmaintainer="www.wang.org"version="ubuntu_base:v1.0"......
  • Nginx负载均衡当其中一台服务器挂掉之后,Nginx负载将会怎样呢?
    Nginx负载均衡当其中一台服务器挂掉之后,Nginx负载将会怎样呢? 2021-04-0515:10:23    小道仙    99阅读    0评论之前写过Nginx负载均衡的配置,详......
  • CPI 访问需验证的HTTP接口
    CPI访问外围系统接口时,有时需要先访问验证接口,获取AccessToken或得到账密,然后访问具体接口时,将获取到的验证结果传入具体接口进行访问1、OAuth2.0 AccessToken方式1.1、......
  • IDEA 对项目Maven进行install项目时报错(Failed to execute goal org.apache.maven.plu
    【问题】IDEA对项目Maven进行install项目时报错 错误如下:Failedtoexecutegoalorg.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test(default-test)o......
  • 反序列化(钩子函数进行复杂数据验证)
    反序列化(钩子函数进行复杂数据验证)5.1验证单个字段序列化器:classStudent1Serializer1(serializers.Serializer):"""学生信息序列化器"""#1.转换的字......