gin框架中form, uri 2种类型的数据绑定到自定义结构体, 绑定数据默认值设置方法, 时间格式绑定和格式设置 详解

gin框架中可以非常方便的将http请求的form数据,和路由参数中的uri 数据通过反射的方式将我们自定义在结构体中的TAG字段和请求参数中同名的数据进行绑定。

        要完成数据的绑定, 首先我们需要定义一个结构体和需要绑定的结构体字段,并在结构体字段中使用TAG标记当前字段需要和那个请求参数进行绑定,方法如下:

1. 请求表单form中的数据绑定至自定义结构体

       要将请求form中的数据【包含,get, post,请求头HEADER中的数据等】绑定到自定义的结构体中, form类型的数据绑定使用tag  form来进行标记绑定关系。

  •  结构体定义
type MyDiy struct {Page int `json:"page" form:"page,default=1"` // 这里将表单中的form 和这里的Page字段进行绑定,如果表单中没有page字段则设置默认值为1Size int `json:"size" form:"size,default=10"`Total int `form:"total"` // 这里将表单中的total和这里的Total进行绑定,注意 这里的total名字可以随意,只要和表单中的对应即可CreatedAt time.Time `form:"created_at" time_format:"2006-01-02T15:04:05Z07:00" time_utc:"1"`
}

  结构体Tag标签定义说明

结构体的TAG标签定义是在结构体字段后面使用 多行字符串符号 `内容 ` 来包括。 在这里可以定义多个tag内容, 多个tag使用空格分隔。

        这里的 json:"xxx"  定义是给json序列化时使用的标签,可以省略;  

form表单绑定HTML 复选框

        form后面定义的是我们进行form绑定用的字段信息的定义,   如: form:"name"  这里的name即是你要和你提交的表单信息绑定对应的name,  如果你的前端提交的是一个 HTML 复选框,的数据,那么你的HTML 复选框的名字就是 类似 name[] 这样的,如:前端表单数据是这样的 <input type="checkbox" name="colors[]" value="red" id="red">  , 那这里的  name 就是 colors[] 这样就可以获取到你前端提交的所有复选框的内容

form绑定默认值设置: 在form定义里面使用逗号分隔后指定default=xxx

        Page int `json:"page" form:"page,default=1"`   这个表示将当前的结构体的 Page 字段在form绑定的时候使用 page这个名称和请求参数中的 page参数的值进行绑定, 如果请求参数中没有page字段,则将default定义的值设置为page的默认值。 

form绑定时间格式设置

     CreatedAt time.Time `form:"created_at" time_format:"2006-01-02T15:04:05Z07:00" time_utc:"1"`   这个的意思就是将请求参数中的 created_at字段和这里的 CreatedAt进行绑定,同时设置了时间的格式为"2006-01-02T15:04:05Z07:00" 【time.RFC3339】, 如果不指定则默认的时间格式为time.RFC3339, 如果表单中的created_at 时间是一个数字时间戳,则这里的格式就需要指定是 "unix" 秒的时间戳   还是 "unixnano"  纳秒时间戳 , 

time_utc:"1" 表示指定当前的时间是UTC时间, 0表示不是UTC时间, 这个地方的值会被解析为一个布尔值。

对于时间格式,这里还可以有一个tag可设置,即  time_location  用来设置本地时间, 详见 time.LoadLocation(name string) , 如: time_location:"PRC" 这个就表示当前时间为中国时间

 CreatedAt time.Time `form:"created_at" time_format:"2006-01-02T15:04:05Z07:00" time_utc:"1" time_location:"PRC"` 

  • form数据绑定示例

package mainimport ("log""time""github.com/gin-gonic/gin"
)type MyDiy struct {Page int `json:"page" form:"page"` // 这里将表单中的form 和这里的Page字段进行绑定Size int `json:"size" form:"size,default=10"` // 带默认值 ,如果表单中没有size字段则设置默认值为10Total int `form:"-"` // 这里的 - 表示对当前字段忽略form的绑定CreatedAt time.Time `form:"created_at" time_format:"2006-01-02T15:04:05Z07:00" time_utc:"1"` // 时间类型绑定,同时还指定了时间布局格式 和是否utc时间
}func main() {route := gin.Default()route.GET("/diy", startPage)route.Run(":8080")
}func startPage(c *gin.Context) {var diy MyDiy// 如果是 `GET` 请求,只使用 `Form` 绑定引擎(`query`)。// 如果是 `POST` 请求,首先检查 `content-type` 是否为 `JSON` 或 `XML`,然后再使用 `Form`(`form-data`)。if c.ShouldBind(&diy) == nil {log.Println(diy.Page)log.Println(diy.Size)log.Println(diy.CreatedAt)}c.String(200, "Success")
}

这时我们只要访问  http://localhost:8080/?page=1&cteated_at=2024-07-01T14:51:58 就会将当前的参数page,cteated_at的数据自动绑定到我们定义的结构体MyDiy上面, 我们这里没有传递参数 size 就会使用我们在结构体TAG里面定义的默认值 10班的到MyDiy上面。

2. 路由参数uri的参数绑定

uri的参数绑定相对于form绑定而已较为简单,请看一下示例:

package mainimport "github.com/gin-gonic/gin"type Person struct {ID   string `uri:"id" binding:"required,uuid"`Name string `uri:"name" binding:"required"`
}func main() {r := gin.Default()r.GET("/:name/:id", func(c *gin.Context) {var person Personif err := c.ShouldBindUri(&person); err != nil {c.JSON(400, gin.H{"msg": err.Error()})return}c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID})})r.Run(":8088")
}

总结:

gin框架中的数据绑定的难点就在于结构体标签TAG的定义, form的绑定使用  form:"xxx"来定义, uri的绑定使用  uri:"xxx"来定义。  uri的绑定和form表单绑定的区别就是在定义结构体标签的事后他们采用的标签名称不同。还有他们绑定的数据源不同而已。 uri绑定的是uri中的路由定义参数, form绑定的是http的请求参数,包含get, post, 上传数据, 还有http请求的头部header数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用可视化的方式学统计学

本次分享一个统计学学习工具:看见统计。 看见统计致力于用数据可视化 (使用D3.js完成) 让统计概念更容易理解,源于布朗大学几位作者👇 看见统计共有6个章节, 下面来看看具体内容, 中心极限定理 对于一个(性质比较好的)分布,如果我们有足够大的独立同分布的样本,其…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么&#xff0c;而不是以什么形式做。 以函数式接口Runnable为例讲解&#xff1a; public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

C语言实现简单的minishell

探索开源项目&#xff1a;MiniShell 引言 在计算机编程的世界里&#xff0c;Shell 是一个至关重要的组成部分&#xff0c;它允许用户与操作系统交互&#xff0c;执行命令和程序。MiniShell 是一个简化版的 Shell 程序&#xff0c;通常用于教学和学习目的。在本文中&#xff0…

第3篇 区块链技术的核心要素:共识机制、加密技术与分布式账本

区块链听起来像个非常高大上的技术&#xff0c;其实它的核心原理并不难理解。今天我们要聊的就是区块链的三个核心要素&#xff1a;共识机制、加密技术和分布式账本。想象一下区块链是一个巨大的数字笔记本&#xff0c;我们要弄清楚大家如何共同写这个笔记本&#xff0c;又如何…

《梦醒蝶飞:释放Excel函数与公式的力量》8.2 COUNTA函数

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果&#xff0c;是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

创新校园服务模式 跑腿小程序平台源码构建与实践 前后端分离 带完整的安装代码包以及部署教程

系统概述 本项目是一个集任务发布、接单、支付、评价于一体的跑腿服务小程序平台&#xff0c;专为高校校园设计。系统采用前后端分离架构&#xff0c;前端负责用户界面展示和交互逻辑&#xff0c;后端处理业务逻辑、数据存取等&#xff0c;两者通过API接口进行通信&#xff0c…

二叉树的右视图-二叉树

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 层序遍历&#xff0c;广度优先 queue先进后出&#xff0c;每层从左往右进树&#xff0c;最后一个就是最右边的数&#xff1b;pop掉这层的。push下一层&#xff1b; class Solution { public:vector<int> r…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 混淆矩阵 假设我们有包含临床测量数据的医疗数据&#xff0c;例如胸痛、良好的血液循环、动脉阻塞和体重…

华为机试HJ4字符串分隔

华为机试HJ4字符串分隔 题目&#xff1a; 将输入的字符串分隔为每8个一个新字符串&#xff0c;最有一个不足8个用0来填充。 想法&#xff1a; 遍历提取输入字符串中的每8个字符&#xff0c;填充最后一个不满足长度的字符串&#xff0c;用0填充至8个 input_str input() if…

如何将音频文件发送至摄像头

目前再很多互联互通的场景下&#xff0c;如AI盒子再从摄像头上取视频分析&#xff0c;分析出发生某个事件&#xff0c;需要反向通过摄像头的喇叭播放语音&#xff0c;发出告警提示&#xff0c;使用场景如下 盒子上对于此类场景的需求往往不能满足&#xff0c;或者为这个需求需要…

list对象根据对象属性去重

对List中的对象根据某个属性进行去重的情况。例如&#xff0c;我们有一个实体类student&#xff0c;其中包含属性id、name和age&#xff0c;现在我们有一个List<Student>&#xff0c;我们希望根据name属性去除重复的Student对象。 我们可以借助HashSet的特性&#xff0c;…

APP性能测试

1、性能测试分类&#xff1a;&#xff08;CPU&#xff0c;内存&#xff0c;流量&#xff0c;时间&#xff08;启动耗时计算&#xff09;&#xff0c;电量&#xff0c;流畅度&#xff08;帧率&#xff09;&#xff09;&#xff0c;稳定性&#xff08;崩溃&#xff0c;闪退&#…

感动的短视频:成都柏煜文化传媒有限公司

感动的短视频&#xff1a;瞬间触动心灵的温暖力量 在这个快节奏、高压力的时代&#xff0c;我们常常在忙碌与喧嚣中穿梭&#xff0c;心灵深处那份最纯粹的感动似乎变得愈发珍贵而难得。然而&#xff0c;就在这样一个数字化盛行的今天&#xff0c;短视频以其独特的魅力&#xf…

[答疑]就喜欢把“不变式”叫“固定规则”,不行吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;匿&#xff09;2024-6-28 15:52 这篇文章把不变式叫做固定规则&#xff0c;被您批评了。我想请教一下什么时候可以用不同的译法&#xff1f;像您的软件方法用涉众&#x…

二百四十二、Hive——Hive的动态分区表出现day=__HIVE_DEFAULT_PARTITION__分区

一、目的 Hive的DWD层动态分区表的分区出现day__HIVE_DEFAULT_PARTITION__&#xff0c;有点懵&#xff0c;而且表中数据的day字段也显示__HIVE_DEFAULT_PARTITION__ 1、DWD层动态分区表的分区 __HIVE_DEFAULT_PARTITION__ 2、DWD层分区字段day数据 __HIVE_DEFAULT_PARTITION…

农业气象监测仪:现代农业的“守护神”

随着科技的不断进步&#xff0c;农业生产也逐渐迈入了智能化的新时代。在众多的农业科技产品中&#xff0c;农业气象监测仪以其独特的优势&#xff0c;成为了现代农业不可或缺的一部分。本文将从多个角度探讨农业气象监测仪在农业中的优势&#xff0c;以及它如何助力农业生产实…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…

pdf合并工具,pdf合并器,多个pdf合并成一个pdf

你是否有过这样的困扰&#xff1a;手头上有好几个pdfF文档&#xff0c;需要将它们合并成一个单一的文件&#xff0c;但却不知道从何下手&#xff1f;别担心&#xff0c;这篇文章将为你揭秘多个pdf合并成一个pdf的方法&#xff0c;让你轻松实现pdf文档整合的问题&#xff01; 首…

python 中的 下划线_ 是啥意思

在 Python 中&#xff0c;_&#xff08;下划线&#xff09;通常用作占位符&#xff0c;表示一个变量名&#xff0c;但程序中不会实际使用这个变量的值。 目录 忽略循环变量&#xff1a;忽略函数返回值&#xff1a;在解释器中使用&#xff1a;举例子1. 忽略循环变量2. 忽略不需…