gin框架29--自定义验证器

2023-10-27

gin框架29--自定义验证器

介绍

本文介绍了如何在gin框架中自定义验证器,并加以案例说明。

案例

源码:

package main

import (
	"net/http"
	"time"

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

// Booking 包含绑定和验证的数据。
type Booking struct {
	CheckIn  time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`
	CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn,bookabledate" time_format:"2006-01-02"`
}

var bookableDate validator.Func = func(fl validator.FieldLevel) bool {
	date, ok := fl.Field().Interface().(time.Time)
	if ok {
		today := time.Now()
		if today.Year() > date.Year() || today.YearDay() > date.YearDay() {
			return false
		}
	}
	return true
}

func main() {
	route := gin.Default()

	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		v.RegisterValidation("bookabledate", bookableDate)
	}

	route.GET("/bookable", getBookable)
	route.Run(":8080")
}

func getBookable(c *gin.Context) {
	var b Booking
	if err := c.ShouldBindWith(&b, binding.Query); err == nil {
		c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"})
	} else {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
	}
}

注: 官方文档中通过 today.After(date) 作为判断依据,该方法不准确,会导致一直为false, 因此可以调整为 today.Year() > date.Year() || today.YearDay() > date.YearDay()

测试:

http://127.0.0.1:8080/bookable?check_in=2022-04-01&check_out=2022-04-02
{
    "message": "Booking dates are valid!"
}

http://127.0.0.1:8080/bookable?check_in=2022-04-01&check_out=2022-04-01
{
    "error": "Key: 'Booking.CheckOut' Error:Field validation for 'CheckOut' failed on the 'gtfield' tag"
}

说明

gin官方文档 自定义验证器
gin-gonic/examples-> Struct level validations
gin自定义验证器转化中文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gin框架29--自定义验证器 的相关文章

  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • go字符串详解

    文章目录 摘要 1 byte和rune类型 2 字符串 string 3 练习 反转字符串 摘要 go字符串结构体包含 指向底层存储数组的指针 字符串长度 字符串按utf 8将字符编码成二进制数 然后存储在byte数组中 因为utf 8编码
  • 带你使用Golang快速构建出命令行应用程序

    在日常开发中 大家对命令行工具 CLI 想必特别熟悉了 如果说你不知道命令工具 那你可能是个假开发 每天都会使用大量的命令行工具 例如最常用的Git Go Docker等 不管是做技术开发还是业务开发 都会有开发命令行程序的场景 例如如果是
  • go Cobra命令行工具入门

    简介 Github https github com spf13 cobra Star 26 5K Cobra是一个用Go语言实现的命令行工具 并且现在正在被很多项目使用 例如 Kubernetes Hugo和Github CLI等 通过使
  • Golang协程与通道整理

    协程goroutine 不由OS调度 而是用户层自行释放CPU 从而在执行体之间切换 Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之 不通过OS进行切换 自行切换 系统运行开支大大降低 通道channel 并发编
  • Go语言包管理(一)

    Go语言中的包 我们在使用其他语言 比如Java Python 都有类似包的概念 Go也不例外 其核心思想即为分组和模块化 人的大脑对庞大和复杂的事情很难掌控 可以对其采用分而治之的策略 使其模块化 从而更容易管理 如下是标准库中net包的
  • Go_接口、多态、接口继承、空接口、类型断言

    接口 接口是把所有具有共性的方法定义在一起 是方法集 任何类型实现了接口中所有的方法 就是实现了这个接口 接口可以实现多态 接口传递的是地址值 接口定义及调用 定义格式 tepe 接口名 interface 方法名 参数 返回值 调用格式1
  • Golang 内存对齐视频

    https www bilibili com video BV1Ja4y1i7AF 简而言之 就是注意写代码的时候要把相同类型的元素放在一起 更进一步需要自己将结构体配对为32位或64位的整数倍 有助于减少额外空间消耗
  • Go 语言注释教程

    注释是在执行时被忽略的文本 注释可用于解释代码 使其更易读 注释还可用于在测试替代代码时防止代码执行 Go支持单行或多行注释 Go单行注释 单行注释以两个正斜杠 开头 在 和行尾之间的任何文本都将被编译器忽略 不会被执行 示例 This i
  • 有哪些不错的 Golang 开源项目?

    目前人在字节做 Go 开发 寻找 Golang 开源项目学习目的可能是 想学习或者提高自己对 Go 项目的组织和编排能力 想学习 Go 项目的框架设计 想在一些 Go 语法上细节的优化和进阶 我推荐两个项目 一 tinode 这是一个开源的
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门之网关往rpc服务传递数据2

    go zero 的网关服务实际是个 go zero 的 API 服务 也就是一个 http 服务 或者说 rest 服务 http 转 grpc 使用了开源的 grpcurl 库 当网关需要往 rpc 服务传递额外的数据 比如鉴权数据的时候
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero开发入门之gateway深入研究1

    创建一个 gateway 示例 main go package main import flag fmt gateway middleware github com zeromicro go zero core conf github co
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • 【golang】go执行shell命令行的方法( exec.Command )

    所需包 import os exec cmd 的用法 cmd exec Command ls lah ls是命令 后面是参数 e cmd Run 多个参数的要分开传入 如 ip link show bond0 cmd
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • go-carbon v2.3.4 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

    carbon 是一个轻量级 语义化 对开发者友好的 golang 时间处理库 支持链式调用 目前已被 awesome go 收录 如果您觉得不错 请给个 star 吧 github com golang module carbon gite
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github

随机推荐

  • zabbix 之脚本实现企业微信报警及报警升级

    文章目录 一 微信报警 一 对被检测主机创建指定监控项和触发器 二 注册企业微信 三 zabbix服务段配置 四 web监控界面媒介告警配置 五 验证 二 报警升级 一 微信报警 目的 被监控主机test01的mysql服务不可用时立即发送
  • kaggle操作入门

    pip install kaggle kaggle gt Account gt API gt Create New API Token 下载得到 kaggle json 文件 Linux 存放到 home xxx kaggle 中 xxx表
  • 【软考】-高项-范围管理-重要知识点思维导图

    范围管理 文章目录 范围管理 产品范围 项目范围 范围蔓延 镀金 范围潜变 范围蔓延 范围管理计划 含义 包含内容 需求管理内容 需求管理计划 含义 包含内容 作用 可指导 收集需求 工具与技术 访谈 麦肯锡方法 含义 分类 结构化 非结构
  • C++中运算重载和定时器函数的实现

    一 概念 1 在operate函数内实现你想实现的具体的运算操作 这样一来不单单只可以对普通的数进行加减操作 可以对类进行加减操作 在operate函数内实现的加减的具体实现过程就可以 2 运算符重载 就是对已有的运算符重新进行定义 赋予其
  • shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例

    shell脚本系列 10 快速上手bash脚本 简单有效的shell脚本示例 文章目录 shell脚本系列 10 快速上手bash脚本 简单有效的shell脚本示例 前言 1 hello world 2 使用echo打印 3 使用注释 4
  • python利用matplotlib进行可视化

    利用matplotlib进行可视化 1 Matplotlib 基本介绍 Matplotlib 是一个在 python 下实现的类 matlab 的纯 python 的第三方库 旨在用 python实现matlab 的功能 是python下最
  • Flutter Json对象和数组解析成实体类

    1 解析json对象 准备一个json 对象数据 String json res true age 12 Name 张三 使用JSON to Dart 工具自动生成实体类 也可以自己手动写 工具地址 JSON to Dart 将代码复制到类
  • TCP标志位 FIN和RST的区别

    大家都知道TCP释放连接需要四次挥手 主动释放端会发送FIN包 并且因为TCP是双工的 关闭一个方向上的数据流 从而TCP连接处于半关闭状态 这也是为什么需要 四次 挥手的原因 以上所述四次挥手是一种 有序释放 即 标志位为FIN的TCP报
  • 数据结构---二叉树路径问题

    二叉树路径问题 二叉树所有路径 分析 JAVA实现 力扣提交 找到一个和为sum的到达叶子节点的路径 分析 JAVA实现 力扣提交 求路径 中间一段 C 实现 打印根节点到任意节点的路径 JAVA实现 二叉树所有路径 257二叉树所有路径
  • STM32G473VET6 FlashDB数据库移植(裸机、片内Flash)

    STM32G473VET6 FlashDB数据库移植 裸机 片内Flash 此文档也适用于STM32G070 源码下载 此处使用FlashDB官方最新源码 FlashDB 一款支持 KV 数据和时序数据的超轻量级数据库 gitee com
  • Java 实现连接sql server 2000(JDBC数据库访问例子)

    刘金龙 04041222 ljlsunny vip sina com 第一种 通过ODBC连接数据库 JAVA语言的跨平台的工作能力 Write Once Run Anywhere 优秀的图像处理能力 我相信现在没有那种语言可以超过JAVA
  • vim+taglist+ctags+cscope+自动补齐

    下载地址 http download csdn net detail shichaog 8676365 vim命令录制于回放 script t 2 gt time log a vim hacking taglist txt scriptre
  • 【数据结构】

    博客新人 希望大家一起加油进步 乾坤未定 你我皆黑马 目录 1 搜索树 Tree 1 1 概念 1 2 操作 查找 1 3 操作 插入 1 4 操作 删除 难点 1 5 性能分析 2 搜索 2 1 概念及场景 2 2 模型 3 Map的使用
  • 物联网LoRa系列-22:LoRa终端--射频芯片SX1261 SX1262的LoRa专用调制解调器与配置

    目录结构 1 SX1261 2功能模块 2 调制技术的基本原理 3 LoRa调制解调的介绍 4 LoRa调制解调的寄存器设置 1 SX1261 2功能模块 MCU与SX1261 2物理上通过两组接口进行通信 1 SPI总线 2 GPIO中断
  • 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一 缓存带来的问题和原因 我们在发布新版本的时候 在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时 常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了 那么为什么会存在这个问题呢 原因是微信浏览器为了提高性能 自带
  • 让玩家移动到鼠标点击的位置

    bool finish true Vector3 pos public int speed 10 void Start void Update if Input GetMouseButtonDown 0 Ray ray Camera mai
  • 不要做”积极废人”

    确切的说 我算是一个积极废人 最近对我来说有几个思想上大的进步 虽然看起来很简单 但是能够彻底的接受和全新接受 还是需要一些时间的 第一个是对于RESTful的思想 从最近的一些实践和使用情况来看 对系统的设计和模块间轻耦合是有很大的帮助的
  • lab2

    Part1 Exercise 1 boot alloc if n result nextfree return result else uint32 t remainingPages npages uint32 t nextfree uin
  • 常见Web安全漏洞

    常见Web安全漏洞 1 越权漏洞 不同权限账户之间的存在越权访问 检测 抓去a用户功能链接 然后登录b用户对此链接进行访问 抓去a用户功能链接 修改id为b的id 查看是否能看b的相关数据 替换不同的cookie进行测试查看 防范 1服务器
  • gin框架29--自定义验证器

    gin框架29 自定义验证器 介绍 案例 说明 介绍 本文介绍了如何在gin框架中自定义验证器 并加以案例说明 案例 源码 package main import net http time github com gin gonic gin