首页 > 其他分享 >gofiber: 用go-playground/validator校验参数,自定义错误信息

gofiber: 用go-playground/validator校验参数,自定义错误信息

时间:2024-11-30 11:22:55浏览次数:5  
标签:github err 自定义 validator playground go com

一,go-playground/validator官方代码地址

https://github.com/go-playground/validator

二,安装

$ go get -u github.com/go-playground/validator/v10
go: downloading github.com/go-playground/validator/v10 v10.23.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.3
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.4.0
go: downloading golang.org/x/crypto v0.28.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.7
go: downloading golang.org/x/crypto v0.29.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading golang.org/x/net v0.30.0
go: downloading golang.org/x/net v0.31.0
go: added github.com/gabriel-vasile/mimetype v1.4.7
go: added github.com/go-playground/locales v0.14.1
go: added github.com/go-playground/universal-translator v0.18.1
go: added github.com/go-playground/validator/v10 v10.23.0
go: added github.com/leodido/go-urn v1.4.0
go: upgraded golang.org/x/crypto v0.28.0 => v0.29.0
go: upgraded golang.org/x/net v0.30.0 => v0.31.0

 三,应用例子:

1,代码

package controller

import (
	"bytes"
	"fmt"
	"github.com/go-playground/validator/v10"
	"github.com/gofiber/fiber/v2"
	"industry/service"
	"runtime"
	"strconv"
)

type ArticleController struct{}

func NewArticleController() *ArticleController {
	return &ArticleController{}
}


var Validator = validator.New()

type User struct {
    Cid  int    `validate:"required"`
    Bid  int    `validate:"required"`
}

func (dc *ArticleController) ListArticle(c *fiber.Ctx) error {
	var user User
    //也可以用c.BodyParser解析post数据
	if err := c.QueryParser(&user); err != nil {
		fmt.Print(err)
		printStackTrace(err)
	}

	if validationErr := Validator.Struct(&user); validationErr != nil {
		return c.SendString("参数解析:"+validationErr.Error())
	}
    //其他逻辑
}

 

测试效果:

参数解析:Key: 'User.Cid' Error:Field validation for 'Cid' failed on the 'required' tag

四,自定义报错信息

1,结构体:

type User struct {
    Cid  int    `validate:"required" label:"cid需要为整数,请重新输入"`
    Bid  int    `validate:"required" label:"bid需要为整数,请重新输入"`
}

2,返回中文报错信息的函数:

// ProcessErr go validator参数校验器自定义规则及提示
func ValidateMessage(u interface{}, err error) string {
	if err == nil { //如果为nil 说明校验通过
		return ""
	}
	invalid, ok := err.(*validator.InvalidValidationError) //如果是输入参数无效,则直接返回输入参数错误
	if ok {
		return "输入参数错误:" + invalid.Error()
	}
	validationErrs := err.(validator.ValidationErrors) //断言是ValidationErrors
	for _, validationErr := range validationErrs {
		fieldName := validationErr.Field() //获取是哪个字段不符合格式
		typeOf := reflect.TypeOf(u)
		// 如果是指针,获取其属性
		if typeOf.Kind() == reflect.Ptr {
			typeOf = typeOf.Elem()
		}
		field, ok := typeOf.FieldByName(fieldName) //通过反射获取filed
		if ok {
			errorInfo := field.Tag.Get("label") // 获取field对应的reg_error_info tag值
			return fieldName + ":" + errorInfo           // 返回错误
		} else {
			return fieldName + ":" + validationErr.Error()
		}
	}
	return ""
}

说明:label字段不存在时,按默认提示信息返回

3,调用代码

func (dc *ArticleController) ListArticle(c *fiber.Ctx) error {
	var user User
    //c.BodyParser解析post
	if err := c.QueryParser(&user); err != nil {
		fmt.Print(err)
		printStackTrace(err)
		//return c.SendString("参数解析:"+err.Error())

	}



	if validationErr := Validator.Struct(&user); validationErr != nil {
		errmsg:= validate.ValidateMessage(user,validationErr)
		return c.SendString("参数解析:"+errmsg)
	}

 

4,测试效果:

参数解析:Cid:cid需要为整数,请重新输入

 

标签:github,err,自定义,validator,playground,go,com
From: https://www.cnblogs.com/architectforest/p/18577144

相关文章

  • ios短视频开发,自定义缓存策略的实现
    ios短视频开发,自定义缓存策略的实现缓存所占用的空间往往会成为迫使用户卸载应用的最后一根稻草。开发者不能无上限对音视频资源进行缓存,通常的维护手法是通过限制空间大小,比如,用户通常可以接受视频类应用有1G左右的缓存空间,即时通信类应用也许会更大些。因此在ios短视频开发......
  • uni-app vue3 获取 package.json 自定义环境变量
    一、初始化项目 二、添加 package.json 文件(必须)注意:文件里面不要写备注{ "uni-app":{ "scripts":{ "dev":{ "title":"开发版", "env":{ "ENV_TYPE":"dev", "UNI_PLATFORM&q......
  • vue3自定义指令实现截图
    依赖:•使用html2canvas(需要先安装:npminstallhtml2canvas)。绑定事件:•在目标DOM上绑定click事件。截图逻辑:•点击后调用html2canvas截取目标元素的截图。•使用Canvas的toDataURL()方法生成Base64图片。保存文件:•创建一个a标签,通过downloa......
  • RUOYI参数验证异常处理及自定义注解触发验证抛出异常报错
    目录一.ruoyi与参数验证1.触发报错2.后端现象二.源码分析1.前端代码2.后端代码3.报错分析三.自定义函数注解1.NoNumber注解2.NoNumberMain校验器3.将注解添加进SysRole中4.前端&后端现象一.ruoyi与参数验证1.触发报错对参数验证的使用,从触发参数报错开始,首先对ru......
  • 自定义一个WinForm个性化的TabControl
    系列文章目录第一章自定义一个WinForm异形按钮第二章自定义一个WinForm圆角文本框第三章自定义一个WinForm个性化的TabControl文章目录系列文章目录前言一、效果展示自定义TabControl效果展示二、TabControl自定义1.创建一个MyTabControl2.自定义并暴露出一些常......
  • 客户端WinForm实现Form表单格式自定义
    usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.ComponentModel.Design;usingSystem.ComponentModel.Design.Serialization;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;using......
  • 开发者必备:构建自定义CLI格式化工具的完整指南 (5)
    一个工具的命令行界面(CLI)背后其实就是调用相应的API。在这里,我们将实现一个简易的CLI工具,通过它来格式化代码。首先,新建一个名为formattool的项目,并使用pnpminit进行初始化:mkdirformattoolcdformattoolpnpminit-y然后,在项目根目录下创建一个index.js文......
  • Qt从入门到入土(一) QtDesigner完成自定义水波纹和切换开关设计
    这篇文章中,我从0开始讲起,对于新手十分友好,简单完成自定义水波纹和切换开关控件的设计,并将这两个控件结合起来实现交互。项目创建生成一个继承自QWidget的类,并选择Generateform生成对应的ui文件。生成完成后,双击.ui文件打开设计师界面。设计师面板介绍组件面板:窗口左侧......
  • Linux系统自定义服务使用system方式启动步骤
    确定启动的名字,如orzs#启动服务路径/etc/systemd/system/orzs.service 使用systemd启动服务文件所在路径/opt/orzs/start_orzs文件配置文件路径和工作目录#服务工作目录/opt/orzs/#配置文件目录/opt/orzs/etc/文件软连#软连ln-s/opt/orzs/start_orzs/usr......
  • 如何用css自定义滚动条?能做到所有浏览器兼容吗?想要做兼容怎么办呢?
    CSS可以自定义滚动条的样式,但是无法做到所有浏览器完全兼容。不同浏览器对滚动条样式的支持程度不同,特别是老版本浏览器。以下是如何使用CSS自定义滚动条,以及提高兼容性的方法:1.基本样式自定义(WebKit内核浏览器,例如Chrome,Safari,Edge等):::-webkit-scrollbar{w......