Golang Gin 请求参数绑定与多数据格式处理

news2025/1/22 12:39:09

之前学习了使用Gin框架的Engine的默认路由功能解析HTTP请求。现在我们来学习gin框架的参数绑定操作和请求结果返回格式。

处理POST请求时,使用context.PostForm或者context.DefaultPostForm获取客户端表单提交的数据。

像上述这种只有username和password两个字段的表单数据进行提交时,可以使用context.PostForm 和context.GetPostForm获取。

但是如果表单数据较多时,使用PostForm和GetPostForm一次获取一个表单数据,开发效率较慢。

在实际的开发过程当中,往往会面对非常复杂的业务逻辑,比如提交某个数据的时候,需要很多的字段,很多的属性,比如提交用户注册表单,需要用户名注册密码,身份证信息,手机号,昵称等等。如果还是使用上面这种方式获取字段属性,这样就显得效率有些低了。

Gin框架提供给开发者表单实体绑定的功能,可以将表单数据与结构体绑定。(其实也就是将表单提交的数据直接映射为结构体实体)

 

 

表单实体绑定


使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。如下所示:

以一个用户注册功能来进行讲解表单实体绑定操作。用户注册需要提交表单数据,假设注册时表单数据包含三项,分别为:username、phone和password。

创建了UserReglster结构体用于接收表单数据,通过tag标签的方式设置每个字段对应的form表单中的属性名,通过binding属于设置属性是否是必须。

结构体里面的属性对应我们提交表单里面的哪些字段?通过后面的tag标签来设定。这里面有form的属性,这个表示要对应到http请求当中表单当中的哪一个字段。

可以看到Username对应的是表单当中的username字段。

下面是三种表单实体绑定的方式,分别是get请求方式,其次是post请求方式。在post请求方式里面讲两种,其中一种是mutiform格式,其次是json格式。

(1)get请求表单数据提交和服务端具体结构体的定义相应绑定操作

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	engine := gin.Default()
	//http://localhost:8080/hello?name=lucas&class=软件工程
	engine.GET("/hello", func(c *gin.Context) {
		fmt.Println(c.FullPath())

		s := new(Student)
		if err := c.ShouldBindQuery(s); err != nil {
			log.Fatal(err.Error())
			return
		} else {
			fmt.Printf("%#v \n", s)
		}

	})
	engine.Run()

}


[GIN-debug] Listening and serving HTTP on :8080
/hello
&main.Student{Name:"lucas", Class:"软件工程"} 
[GIN] 2023/04/27 - 16:23:18 | 200 |       521.7µs |       127.0.0.1 | GET      "/hello?name=lucas&class=%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B"

type Student struct {
	Name  string `form:"name"`
	Class string `form:"class"`
}

 (2)post请求shouldbind方法 表单提交

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
)

type Register struct {
	Username string `form:"username"`
	Phone    string `form:"phone"`
	Password string `form:"password"`
}

func main() {
	engine := gin.Default()
	engine.POST("/register", func(c *gin.Context) {
		r := new(Register)
		if err := c.ShouldBind(r); err != nil {
			log.Fatal(err.Error())
			return
		} else {
			fmt.Printf("%#v", r)
		}
	})

	engine.Run()
}


[GIN-debug] POST   /register                 --> main.main.func1 (3 handlers)   
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend yo
&main.Register{Username:"lucas", Phone:"18270893704", Password:"kubernetes"}[GIN] 2023/04/27 - 19:42:34 | 200 |      1.3004ms | 

(3)处理json格式的数据

目前很多的团队都是使用json格式来进行开发的,提交数据的时候是使用json格式提交,返回也是使用json格式进行返回。

提交时候注意:提交的数据类型和服务器端定义的结构体字段类型保持一致,否则会报错。

上面就是全部对客户端提交数据的解析过程

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

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

相关文章

CS:APP 第7章链接分步编译(cpp/cc1/as/ld)遇到的问题

环境 WSL Ubuntu 22.04.2 LTS gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 问题 问题一 cc1 命令找不到 cc1 命令在 /usr/lib/gcc/x86_64-linux-gnu/11/cc1 里,注意不同操作系统等可能 cc1 的位置不一样,可以使用 find 或者 locate 命令搜索。 通过下…

聊点技术 | 架构瘦身,让Bonree ONE跑得更轻

4月21日,博睿数据ONE有引力2023春季产品发布会圆满落幕,一体化智能可观测平台Bonree ONE 2023春季正式版正式发布,这一次发布的版本更轻、更强、更智能。 Bonree ONE在上一版基础上削减50%组件数量,下架两大高耗能组件&#xff0c…

97-TCP为什么要有一个“TIME_WAIT“的状态

文章目录 1.TCP为什么要有一个"TIME_WAIT"的状态(1) 可靠的终止 TCP 连接。(2) 保证让迟来的 TCP 报文有足够的时间被识别并被丢弃 ; 2.拓展带外数据 1.TCP为什么要有一个"TIME_WAIT"的状态 "TIME_WAIT"状态存在的原因主要有两点: (1) 可靠的终…

成功经验分享,Nacos注册中心实践,带你玩转Nacos

1、什么是 Nacos ? 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集: 注册中心配置中心服务管理 平台 nacos的特性包括: 服务发现和服务健康监测动态配置服务动态…

行人检测(人体检测)4:C++实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 1. 前言 2. 行人检测(人体检测)检测模型(YOLOv5) (1&#xf…

谈「效」风生 | 如何找到现有研发体系的「内耗问题」?

#第3期:如何找到现有研发体系的「内耗问题」?# 在上一期《谈到提升效能,我们应该如何下手?》我们聊到开始做研发效能的四个要点:评估现有流程、引入自动化工具、建立度量指标、持续改进。本期就围绕「评估现有研发体系…

二次创业接地气、强内功,三只松鼠从一棵树出发重造“人设”

民以食为天,自古以来,“吃”都是一门浅显与深奥并存的生意。产业链看似简单:种、收、制、卖,却足以令众多企业为之前赴后继十年、百年。 三只松鼠,正在这条变革的道路上砥砺前行。自去年4月开启全面转型以来&#xff…

C++ 赋值运算符重载

赋值运算符重载 运算符重载: C为了增强代码的可读性,可以对 运算符 进行重载,运算符重载 就是具有特殊函数名的函数,这个函数也具有返回值类型,函数名字和参数列表,它的返回值和参数列表的形式和普通函数…

基于SAM的二次开发案例收集分享

一、AnyLabeling[1]——制作人:vietanhdev AnyLabeling LabelImg Labelme Improved UI Autolabeling AnyLabeling软件是一个集成了YOLO、Segment Anything模型(AI支持)的高效数据标注工具,它可以通过点击目标的方式完成目标检…

商业银行财富管理“智能原生”能力呈阶梯化,AI助力商业模式趋向多元化发展

易观:金融业的财富管理从经营角度来看,是“客户与渠道管理场景运营产品研发”三位一体共同构建以客户为中心,数据驱动的业务经营体系。其中,“客户与渠道管理”是将客户利益作为核心目标,通过升级用户体验、客户全生命…

获奖名单公布|香港BlockBooster x Moonbeam黑客松圆满收官

Moonbeam基金会赞助的”Into the Socialverse”主题的BlockBooster黑客松于近日落幕。该活动由BlockBooster、OKX、Gitcoin和OxU香港区块链俱乐部联合主办,共有22个开发团队参赛。经过多位评委的严格筛选,3支优秀团队脱颖而出,获得Moonbeam基…

zookeeper集群命令使用

1.zookeeper脚本使用(地址填写集群中任意一个主机地址) 连接客户端命令行 /etc/zookeeper/zookeeper/bin/zkCli.sh -server 10.1.60.112:2181 启动zookeeper服务 /etc/zookeeper/zookeeper/bin/zkServer.sh start 停止zookeeper服务 /etc/zookeeper/zookeeper/bin/zkServer…

春风吹,战鼓擂,忆享科技-云服务事业部春季员工关怀活动集锦,温情相伴

前言 时序更替,忆享科技又迎来新的一年。回顾2022,忆享科技在风雨中前行,实现了一次又一次的突破。在这2023年春暖花开,万物复苏的美好季节,忆享科技怀抱着它满满的关怀向大家走来!春季云服务事业部开展了五…

推动科技企业成长,开源网安受邀参加数字经济企业孵化器建设座谈会

近日,为更好地做好数字经济孵化器的孵化培育工作,推动数字经济孵化器和入驻企业高质量发展,高创公司召开数字经济企业孵化器建设座谈会。高新区工委委员、管委会副主任贺菲出席会议,开源网安合肥公司总经理菅志刚受邀参加本次座谈…

vue生命周期代码示范--Vue基本介绍--MVVM-示意图--数据渲染--事件绑定--修饰符--组件化--和全部代码示范

目录 Vue 基本介绍 官网 git 地址: MVVM-示意图 解读 MVVM 思想(上图) 下载官网 简单的代码示例方便理解 Vue 数据绑定机制分析! 注意事项和使用细节 数据单向渲染 基本说明 应用实例 注意事项和使用细节 数据双向绑定 应用实例 ​编辑代码实现 代码综合-单…

带头双向循环链表--数据结构

魔王的介绍:😶‍🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍&#x1f…

Rocket 框架基础

Rocket v0.5 DOC Rocket是Rust的一个web框架,它使编写快速、安全的web应用程序变得简单,而不会牺牲灵活性、可用性或类型安全性。 类型安全 从请求到响应,Rocket确保您的类型有意义。样板免费 把时间花在编写真正重要的代码上,让…

Amazon S3 对象存储Java API操作记录(Minio与S3 SDK两种实现)

缘起 今年(2023年) 2月的时候做了个适配Amazon S3对象存储接口的需求,由于4月份自学考试临近,一直在备考就拖着没总结记录下,开发联调过程中也出现过一些奇葩的问题,最近人刚从考试缓过来顺手记录一下。 S3对象存储的基本概念 …

Unity Camera -- (4)探索不同类型的镜头

不同类型的镜头会呈现出不同的氛围和感觉,通常镜头的类型和相机聚焦方式和位置相关。本节我们来看看一些常见的不同类型的镜头。 广角 广角镜头通常在画面中包含更多的环境。观众接受到的是通常从远处拍摄的范围更广的视觉信息。 1. 工程窗口中,在Scene…

04/27课后作业(Qt)

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("文件管理"); }Widget::~Widget() {delete ui; }//字体按钮对…