Gin(四):表单数据提交和模型绑定

【Golang】——Gin 框架中的表单处理与数据绑定 Gin 允许注册自定义验证器。import ("regexp"// 注册自定义验证器// 路由err!= nil {return})本篇博客详细介绍了 Gin 框架中表单处理与数据绑定的功能,从基础的表单提交到复杂的数据验证和文件上传,再到完整项目示例,涵盖了实际开发中的常见场景。在下一篇博客中,我们将学习如何处理 API 请求与 JSON 数据绑定,进一步拓展你的 Web 开发能力。 阅读详情

640?wx_fmt=jpeg


上一个章节中已经开始逐渐搭建了一个 web 页面,现在我们开始逐步完善页面上的功能,首先要完成的是登录和注册功能。

640 ?接受表单数据 640

注册页面的 HTML 元素不在详细写出,具体页面代码可以直接参考 Github 上代码。

页面完成后布局:

640?wx_fmt=jpeg


注册页面有三个输入框,分别为 email ,password 和 password again 。

完善后端 Gin 代码。我们在 initRouter 中 userGroup 中编写新的接口。


 
 userRouter.POST("/register", handler.UserRegister)

编写完新的接口就要开始编写 Handler。


 
 func UserRegister(context *gin.Context) {	
     email := context.PostForm("email")	
     password := context.DefaultPostForm("password", "Wa123456")	
     passwordAgain := context.DefaultPostForm("password-again", "Wa123456")	
     println("email", email, "password", password, "password again", passwordAgain)	
 }

UserRegister 方法中采用新的方式来接受 Post 请求提交的表单参数,PostForm 和 DefaultPostForm 。PostForm 直接接受参数,而 DefaultPostForm 可以设置一个默认值,如果前端没有进行传值,那么我们可以设置默认值,如上面的代码,如果前端没有将密码传输过来我们可以设置一个默认密码。

当我们运行并且输入的时候,在控制台上可以清楚的看到我们在表单上的输入。

当我们项目功能完善的时候,就可以完善我们的单元测试。

此时的单元测试交之前有点复杂。

首先我们要构造一个结构,该结构是为了帮助我们将我们要提交的信息存放到表单中,同时要指定请求头信息。


 
 func TestUserPostForm(t *testing.T) {	
     value := url.Values{}	
     value.Add("email", "youngxhui@gmail.com")	
     value.Add("password", "1234")	
     value.Add("password-again", "1234")	
     w := httptest.NewRecorder()	
     req, _ := http.NewRequest(http.MethodPost, "/user/register", bytes.NewBufferString(value.Encode()))	
     req.Header.Add("Content-Type", "application/x-www-form-urlencoded; param=value")	
     router.ServeHTTP(w, req)	
     assert.Equal(t, http.StatusOK, w.Code)	
 }

单元测试编写完成后可以运行单元测试,发现控制台答应了我们在测试中写的数据。

640 ?模型绑定 640

上例中我们的表单仅仅传输了三个参数,如果后期项目出现了十多个参数,每次写一遍都很花费时间,也很消耗经历。下面就对该方法进行改善

Gin 中提供了 模型绑定,将我们的表单数据与我们的模型进行一样绑定。GIn会将数据统一封装到模型中,方便我们日后使用。

首先定义我们的模型,新建 model 文件夹,建立 userModel.go


 
 package model	
 	
 type UserModel struct {	
     Email         string `form:"email"`	
     Password      string `form:"password"`	
     PasswordAgain string `form:"password-again"`	
 }

通过 form:"email" 来对表单中的  email 输入数据进行绑定。然后需要修改一下 Handler 方法。


 
 func UserRegister(context *gin.Context) {	
     var user model.UserModel	
     if err := context.ShouldBind(&user); err != nil {	
         println("err ->", err.Error())	
         return	
 }	
     println("email", user.Email, "password", user.Password, "password again", user.PasswordAgain)	
 }

此时我们的模型绑定已经写好,运行 TestUserPostForm 测试用例,测试用例可以完美的通过。说明我们的模型绑定方法是正确的。同时模型绑定还是从 json, xml ,yml  等格式数据的绑定,日后会有介绍和说明。当然也可以通过浏览器中的注册表单进行提交。

640 ?数据校验 640

做后端开发的人都明白一个道理:永远不要相信前端传过来的数据。所有的数据在进过后端时,务必要进行数据的校验。

在模型中可用 binding 来对数据进行校验。Gin 对于数据校验使用的是 validator.v8 库,该库提供多种校验方法。通过 binding:"" 方式来进行对数据的校验。

我们将 UserModel 进行修改,添加一些规则,邮箱验证和密码校验,要求第二次重复密码要和第一次密码一致。更多的校验规则可以看官方文档


 
 type UserModel struct {	
     Email         string `form:"email" binding:"email"`	
     Password      string `form:"password"`	
     PasswordAgain string `form:"password-again" binding:"eqfield=Password"`	
 }

我们重新写一个测试用例用来测试邮箱和密码校验是否有效。


 
 func TestUserPostFormEmailErrorAndPasswordError(t *testing.T) {	
     value := url.Values{}	
     value.Add("email", "youngxhui")	
     value.Add("password", "1234")	
     value.Add("password-again", "qwer")	
     w := httptest.NewRecorder()	
     req, _ := http.NewRequest(http.MethodPost, "/user/register", bytes.NewBufferString(value.Encode()))	
     req.Header.Add("Content-Type", "application/x-www-form-urlencoded; param=value")	
     router.ServeHTTP(w, req)	
     assert.Equal(t, http.StatusOK, w.Code)	
 }

运行测试,发现测试虽然通过了,但是会有两行 error 信息


 
 err ->  Key: 'UserModel.Email' Error:Field validation for 'Email' failed on the 'email' tag	
 Key: 'UserModel.PasswordAgain' Error:Field validation for 'PasswordAgain' failed on the 'eqfield' tag

该信息说明了我们的 Email 和 PasswordAgain 信息校验没有通过。

640 ?使用Log和重定向 640

测试通过是因为无论我们代码如何都会返回 200 状态码,这是不符合http 状态码的规范的,所以我们要对http状态码进行规范化。同时我们之前的代码中一直使用 Printf 来打印日志信息,也是不规范的,因为 Printf 打印的日志信息相对局限,所以应该选用 Log 进行日志打印。


 
 func UserRegister(context *gin.Context) {	
     var user model.UserModel	
     if err := context.ShouldBind(&user); err != nil {	
         log.Println("err ->", err.Error())	
         context.String(http.StatusBadRequest, "输入的数据不合法")	
     } else {	
         log.Println("email", user.Email, "password", user.Password, "password again", user.PasswordAgain)	
         context.Redirect(http.StatusMovedPermanently, "/")	
   }	
 }

首先我们将原来只用 Println 打印的数据都改成了 log 去打印数据。

同时将原来的状态码都进行了更改,不同的状态码代表不同的请求响应结果。

最后在请求成功的时候我们对路由进行了重定向,将页面转跳到首页。

同时我们也要将测试用例里的返回状态码进行修改。

640 ✍总结 640

本节将表单提交,模型绑定和数据校验有了一个相对细致的介绍,代码中也通过不同的测试用例来检查代码是否正确。

640 ?‍?本章节代码 640

请点击阅读原文

往期推荐

Gin(一):Hello Gin

Gin(二):路由Router

Gin(三):搭配模板tmpl



640?wx_fmt=jpeg


好看的人才能点 640



ESP32脑机接口开发板:EEG信号采集与应用开发指南 脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6 阅读详情

相关推荐

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 342

go gin框架:PostForm接收form表单请求并DefaultPostForm赋默认值

package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.POST("postForm", postForm) r.Run() } func postForm(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "id_": c.DefaultPostForm("id", "100"), "name_

学亮编程手记 1966

Wireshark、Fiddler、Charles 三款抓包工具的本质差异与选型指南

抓包工具是网络调试与接口分析的基础能力,其核心在于理解OSI模型分层原理——不同工具工作在不同协议层级,解决不同维度问题。Wireshark面向网络层(L2/L3),可捕获原始数据帧与TCP握手细节,适用于DNS异常、丢包重传等底层问题定位;Fiddler和Charles则工作在应用层(L7),作为HTTP(S)代理实现HTTPS解密、请求改写与弱网模拟,是API调试与移动端测试的首选。技术价值体现在:精准匹配问题域(如证书固定需Fiddler脚本绕过,iOS调试依赖Charles证书信任链),避免‘用显微

weixin_28831341的博客 254

Gin之获取form表单参数

Gin之获取form参数

weixin_52690231的博客 3361

Agent 团队管理手册:如何设定目标、分配角色与解决冲突

本文从Agent团队的底层逻辑出发,完整讲解了Agent团队管理的三大核心模块:目标设定(分层拆解+对齐校验)、角色分配(能力匹配+最优算法)、冲突处理(分类处理+仲裁投票),并提供了可直接运行的完整代码示例。通过本文的方法,你可以快速搭建一个高效协作的Agent团队,大幅提升复杂任务的完成效率和准确率。Agent团队是未来AI应用的核心形态,现在正是落地的黄金期,建议你从一个小场景开始动手实践,逐步优化自己的Agent团队管理方法论。

AI天才研究院 236

全局子程序 参数调用

为什么要子程序: 为了实现程序结构化,我们尽量使用不同功能的功能块来实现一些特定的功能, 子程序接口: 使用过程的注意事项,尤其是数组使用时的注意事项 从一个主程序中可以将参数传递到局部或全局子程序和函数中。 怎样传递参数有 2 种方式: 作为 IN 参数 变量值在主程序中保持不变。 这种传递方式也称为“ 值传递 (Call by Value)”。 作为 OUT 参数 子程序读取并更改该值,然后将新值写回到主程序中。 这种传递方式也称为“Call by Reference”。 举例说明 1 DEF MY

Eric_Yang1024的博客 1095

Gin——请求发送和路由总结

Gin是Golang的一个web框架,性能高且拓展性强,使用也很简单;下面简单介绍一些请求时常用到的操作;注当下前后端分离项目居多,所以对于Gin框架模板相关的内容就不介绍了;

YXXXYX的博客 2191

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 366

gin框架入门(三)-路由参数

gin入门,路由参数

qq522044637的博客 901

ECC密码的加密和解密(附带代码实现)

ECC,全称Elliptic Curve Cryptography,是椭圆曲线密码学。这是一种公钥加密技术,其安全性基于椭圆曲线离散对数问题,被广泛应用于信息安全领域。ECC的主要优势在于,相较于RSA和DSA等其他传统的公钥密码体系,它能够在提供相同安全级别的情况下,使用更短的密钥,从而减少计算量和存储空间的需求。例如,一个256位的ECC密钥提供的安全性可以与3072位的RSA密钥或DSA密钥相媲美。ECC的主要应用领域包括SSL安全证书、安全电子邮件、移动设备安全、物联网设备安全等。

xixixi7777的博客 8273

告别抖动与滞后:深入博能传动伺服DSC功能,用105报文提升多轴同步性能

本文深入解析博能传动伺服DSC功能如何通过105报文实现多轴同步性能提升,有效解决工业自动化中的抖动与滞后问题。详细介绍了DSC技术原理、105报文实现机制及多轴同步工程实践,帮助工程师优化伺服系统性能,实现绝对齿轮同步。

weixin_30394981的博客 185

go语言 gin框架学习笔记(四)之 post请求与参数默认值

post 请求时是通过PostForm获取前端body中传入的参数 可以使用DefaultPostForm为参数设置一个默认值,当前端没有传参时直接默认值赋值给相应的参数 代码展示 package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router :=gin.Default() ...

SeaLong_的博客 4877

一文看懂EMMC原理及工作过程

CMD:用于设备初始化和命令传输的双向通道, CMD信号有2种工作模式:1#:漏极开路--->用于初始化模式2#:推拉--->用于快速命令传输其中命令从eMMC主机控制器发送到eMMC设备,响应从设备发送到主机。DAT [7:0]:双向数据信号,模式包括:1(DAT0);默认情况下,通电或重置后,只有DAT0用于数据传输。DAT信号在推挽模式下工作,eMMC设备包括数据线DAT1-DAT7的内部上拉。进入4位模式后,设备立即断开线路DAT1、DAT2和DAT3的内部上拉;

Airer_00的博客 2036

Gin(四):表单提交校验和模型绑定

上一个章节中已经开始逐渐搭建了一个 web 页面,现在我们开始逐步完善页面上的功能,首先要完成的是登录和注册功能。

代码猎奇站 2647

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

go : gin 表单提交

背景: 本文介绍gin 配合表单提交数据交互,并以json的个数输出数据 package main import ( "github.com/gin-gonic/gin" ) type myForm struct { Colors []string `form:"colors[]"` } func main() { r := gin.Default() r.LoadHTMLGlob...

feiger的专栏 1871

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Gin 框架中的表单处理与数据绑定

Gin框架允许注册自定义验证规则。import ("regexp"// 注册自定义验证规则})首先,根据表单的需要定义一个或多个结构体。这些结构体应该清晰地反映表单数据的结构和类型。在上面的例子中,我们使用了结构体标签(struct tags)来指定表单字段的名称(form:"...")和JSON键(json:"..."),以及数据验证规则(如确保表单字段的名称与结构体字段的名称一致,可以极大地简化数据绑定和验证的过程。

m0_70066267的博客 1306

《Gin 框架中的表单处理与数据绑定》

通过使用 Gin 框架的表单处理和数据绑定功能,开发者可以更加方便地接收和处理用户提交的表单数据,提高开发效率。同时,Gin 框架还提供了强大的表单验证和文件上传功能,使得开发者能够更加安全地处理用户提交的数据。Gin 框架采用了 Martini 框架的设计理念,并在此基础上进行了改进和优化,提供了更加丰富的功能和更好的性能。Gin 是一个用 Go 语言编写的高性能 Web 框架,它提供了强大的表单处理和数据绑定功能,使得开发者能够轻松地接收和处理用户提交的表单数据。(二)表单数据的接收。

weixin_47266126的博客 986
上一篇: Gin(三):配合模板 Tmpl
下一篇: 随机洗牌算法之Knuth-Durstenfeld Shuffle
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值