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字段则设置默认值为1
	Size 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 main

import (
	"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字段则设置默认值为10
	Total 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 main

import "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 Person
		if 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.mfbz.cn/a/763891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么这几年参加PMP考试的人越来越多

参加PMP认证的人越来越多的原因我认为和社会发展、职场竞争、个人提升等等方面有着不小的关系。国际认证与国内认证的性质、发展途径会有一些区别&#xff0c;PMP引进到中国二十余年&#xff0c;报考人数持增长状态也是正常的。 具体可以从下面这几个点来展开论述。 市场竞争…

【技术追踪】SegGuidedDiff:基于分割引导扩散模型实现解剖学可控的医学图像生成(MICCAI-2024)

它来了它来了&#xff0c;它带着 mask 做生成了~ SegGuidedDiff&#xff1a;提出一种用于解剖学可控医学图像生成的扩散模型&#xff0c;在每个采样步骤都遵循多类解剖分割掩码并结合了随机掩码消融训练算法&#xff0c;可助力乳房 MRI 和 腹部/颈部到骨盆 CT 等任务涨点。 论文…

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外&#xff0c;还有非常多且优秀的第三方库、包、模块。 模块Module&#xff1a;以…

LangChain 开发智能Agent,你学会了吗?

Prompt Enginnering 是打开LLM宝库的一把金钥匙&#xff0c;如果prompt得法&#xff0c;并能将其技巧与某项工作深度结合&#xff0c;那必将大大增效。今天我们来聊聊如何优化Prompt设计、Prompt Template管理等技术和体力活&#xff0c;并赋能老喻干货店的营销活动。 LLM Pro…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意&#xff1a;远程调试的代码需要与本地代码一致&#xff0c;远程调试目的是解决本地环境无法支持调试的情况下&#xff0c;解决线上&#xff08;测试&#xff09;环境调试问题。 配置启动脚本参数 n…

昇思25天学习打卡营第10天|linchenfengxue

基于MobileNetv2的垃圾分类 通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#x…

TikTok直播限流与网络的关系及解决方法

TikTok作为一款热门的社交平台&#xff0c;其直播功能吸引了大量用户。然而&#xff0c;一些用户可能会遇到TikTok直播限流的问题&#xff0c;例如直播过程中出现播放量低、直播画面质量差等情况。那么&#xff0c;TikTok直播限流与所使用的网络线路是否有关系&#xff1f;是否…

TypeScript Project References npm 包构建小实践

npm 包输出 es/cjs 产物 在开发一个 npm 包时&#xff0c;通常需要同时输出 ES 模块和 CommonJS 模块的产物供不同的构建进行使用。在只使用tsc进行产物编译的情况下&#xff0c;我们通常可以通过配置两个独立的 tsconfig.json 配置文件&#xff0c;并在一个 npm script 中 执…

typescript学习回顾(五)

今天来分享一下ts的泛型&#xff0c;最后来做一个练习 泛型 有时候&#xff0c;我们在书写某些函数的时候&#xff0c;会丢失一些类型信息&#xff0c;比如我下面有一个例子&#xff0c;我想提取一个数组的某个索引之前的所有数据 function getArraySomeData(newArr, n:numb…

Mouse Prealbumin ELISA Kit小鼠前白蛋白ELISA试剂盒

前白蛋白&#xff08;PRE&#xff09;是一种由4条相同的多肽链组成的四聚体蛋白。电泳时&#xff0c;它比血清白蛋白的迁移速度更快&#xff0c;PRE可以作为多种疾病患者营养评价的标志物。ICL的Mouse Prealbumin ELISA Kit应用双抗体夹心法测定小鼠样本中前白蛋白水平&#xf…

CentOS7源码安装nginx并编写服务脚本

华子目录 准备下载nginx源码包关闭防火墙关闭selinux安装依赖环境 解压编译安装测试编写服务脚本&#xff0c;通过systemctl实现服务启动与关闭测试 准备 下载nginx源码包 在源码安装前&#xff0c;我们得先下载nginx源码包https://nginx.org/download/这里我下载的是nginx-1…

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

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

transformer——多变量预测PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)——transformer多变量预测

写在最前&#xff1a; 在系统地学习了Transformer结构后&#xff0c;尝试使用Transformer模型对DNA序列数据实现二分类&#xff0c;好久前就完成了这个实验&#xff0c;一直拖着没有整理&#xff0c;今天系统的记录一下&#xff0c;顺便记录一下自己踩过的坑 &#xff08;需要…

OpenHarmony开发实战:GPIO控制器接口

功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多个寄存器与之关联&#xff0c;通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Echarts 问题集锦

最近公司集中做统计图表&#xff0c;新手小白&#xff0c;真被Echarts折腾地不轻&#xff0c;怕自己年老记忆衰退&#xff0c;特地做一些记录。以备后面查阅。 1、X轴的 数据显示不全&#xff0c;间或不显示 很奇葩&#xff0c;我发现数据里有一个值为0.0&#xff0c;当这条记…

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速&#xff0c;但是大多数液压件生产企业规模小、自主创新能力不足&#xff0c;大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制&#xff0c;高端液压件产品研发生产水平不足&#xff0c;无法形成有效的供给&a…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS &#xff08;Cloud Linux Service&#xff09;为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

生物墨水的重要特性

生物打印技术正以前所未有的速度发展&#xff0c;为组织工程和再生医学领域带来了革命性的变革。然而&#xff0c;成功打印出功能性的三维结构&#xff0c;并将其应用于人体&#xff0c;离不开生物墨水这一关键材料。主要特性包括&#xff1a; 物理性质 表面张力: 表面张力影…

基于java+springboot+vue实现的社团管理系统(文末源码+Lw)270

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…
最新文章