Gin框架操作指南06:POST绑定(下)
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:没用过Gin的读者强烈建议先阅读第一节:Gin操作指南:开山篇。
本节继续演示POST绑定,包括将request-body绑定到不同的结构体中;映射查询字符串或表单参数;上传文件 Query和post-form。
目录
- 一、将request-body绑定到不同的结构体中
- 二、映射查询字符串或表单参数
- 三、上传文件
- 四、Query和post-form
一、将request-body绑定到不同的结构体中
package mainimport ("net/http""github.com/gin-gonic/gin"
)// 定义表单结构体 formA,包含一个必需字段 Foo
type formA struct {Foo string `json:"foo" xml:"foo" binding:"required"` // 绑定 JSON 和 XML 的字段 foo
}// 定义表单结构体 formB,包含一个必需字段 Bar
type formB struct {Bar string `json:"bar" xml:"bar" binding:"required"` // 绑定 JSON 和 XML 的字段 bar
}// 处理请求的函数
func SomeHandler(c *gin.Context) {objA := formA{} // 创建 formA 的实例objB := formB{} // 创建 formB 的实例// c.ShouldBind 使用了 c.Request.Body,不可重用。if errA := c.ShouldBind(&objA); errA == nil {// 如果绑定成功,返回表单A的成功信息c.String(http.StatusOK, `the body should be formA`)} else if errB := c.ShouldBind(&objB); errB == nil {// 因为现在 c.Request.Body 是 EOF,所以这里会报错。c.String(http.StatusOK, `the body should be formB`)} else {// 处理绑定错误c.String(http.StatusBadRequest, `Invalid input`)}
}func main() {router := gin.Default()router.POST("/some-handler", SomeHandler) // 注册路由router.Run(":8080") // 启动服务器
}
注意if分支中的注释,效果如下


要想多次绑定,可以使用 c.ShouldBindBodyWith.
func SomeHandler(c *gin.Context) {
objA := formA{}
objB := formB{}
// 读取 c.Request.Body 并将结果存入上下文。
if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil {
c.String(http.StatusOK, the body should be formA)
// 这时, 复用存储在上下文中的 body。
} else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil {
c.String(http.StatusOK, the body should be formB JSON)
// 可以接受其他格式
} else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil {
c.String(http.StatusOK, the body should be formB XML)
} else {
…
}
}
c.ShouldBindBodyWith 会在绑定之前将 body 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,那就不要用这个方法。
只有某些格式需要此功能,如 JSON, XML, MsgPack, ProtoBuf。 对于其他格式, 如 Query, Form, FormPost, FormMultipart 可以多次调用 c.ShouldBind() 而不会造成任任何性能损失 (详见 #1341)。
二、映射查询字符串或表单参数
package mainimport ("fmt" // 导入格式化I/O库"github.com/gin-gonic/gin" // 导入Gin框架
)func main() {router := gin.Default() // 创建默认的Gin路由// 设置处理POST请求的路由router.POST("/post", func(c *gin.Context) {// c.QueryMap("ids") 用于映射查询字符串中的 "ids" 参数// 例如:POST /post?ids[a]=1234&ids[b]=hello// 这个方法会将查询参数转换为一个map,key为参数名,value为参数值ids := c.QueryMap("ids")// c.PostFormMap("names") 用于映射表单数据中的 "names" 参数// 例如:names[first]=thinkerou&names[second]=tianou// 这个方法会将表单数据转换为一个mapnames := c.PostFormMap("names")// 打印解析后的 ids 和 names 的值// ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou]fmt.Printf("ids: %v; names: %v", ids, names)})router.Run(":8080") // 启动服务器并监听8080端口
}
打开postman,输入http://localhost:8080/post?ids[a]=1234&ids[b]=hello
然后在body中添加key和value,注意names[]作为一个key,效果如图

三、上传文件
在”上传文件”,目录下建立两个文件夹demo01和demo02,demo01用于单文件上传:
package mainimport ("fmt""log""net/http""github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)// 将内存限制设置为 8 MiB,这意味着如果上传的文件超过这个大小,// 将会返回错误,确保服务器不会因为大文件上传而耗尽内存router.MaxMultipartMemory = 8 << 20 // 8 MiB// 定义一个 POST 路由,处理文件上传router.POST("/upload", func(c *gin.Context) {// 从请求中获取文件,"file" 是表单字段的名称file, err := c.FormFile("file")if err != nil {// 处理文件获取错误,返回状态码 400 和错误信息c.String(http.StatusBadRequest, "Error retrieving the file")return}// 打印文件名到服务器日志log.Println(file.Filename)// 设置文件保存的目标路径,文件将保存在当前目录下dst := "./" + file.Filename// 上传文件至指定的完整文件路径if err := c.SaveUploadedFile(file, dst); err != nil {// 如果文件保存失败,返回状态码 500 和错误信息c.String(http.StatusInternalServerError, "Unable to save the file")return}// 返回成功信息,告知用户文件已上传c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))})// 启动服务器,监听 8080 端口router.Run(":8080")
}
打开postman,输入http://loaclhost:8080/upload,在body中填充form-data,key=file,类型为File,然后选择文件,选好后点击send,效果如下



多文件上传
package mainimport ("fmt""log""net/http""github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)// 将内存限制设置为 8 MiB,这意味着如果上传的文件总大小超过这个限制,// 将返回错误,确保服务器不会因为大文件上传而耗尽内存router.MaxMultipartMemory = 8 << 20 // 8 MiB// 定义一个 POST 路由,用于处理文件上传router.POST("/upload", func(c *gin.Context) {// Multipart form// 从请求中获取 multipart 表单数据form, err := c.MultipartForm()if err != nil {// 如果获取 multipart 表单数据失败,返回状态码 400 和错误信息c.String(http.StatusBadRequest, "Failed to get multipart form")return}// 获取上传的文件,"upload[]" 是表单字段的名称files := form.File["upload[]"]// 遍历每个文件for _, file := range files {// 打印文件名到服务器日志log.Println(file.Filename)// 设置文件保存的目标路径,文件将保存在当前目录下dst := "./" + file.Filename// 上传文件至指定目录if err := c.SaveUploadedFile(file, dst); err != nil {// 如果文件保存失败,返回状态码 500 和错误信息c.String(http.StatusInternalServerError, "Unable to save the file")return}}// 返回成功信息,告知用户上传的文件数量c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))})// 启动服务器,监听 8080 端口router.Run(":8080")
}

四、Query和post-form
package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {// 创建一个新的 Gin 路由引擎router := gin.Default()// 定义一个 POST 路由,用于处理 POST 请求router.POST("/post", func(c *gin.Context) {// 从查询字符串中获取 "id" 参数id := c.Query("id")// 从查询字符串中获取 "page" 参数,如果未提供,则返回默认值 "0"page := c.DefaultQuery("page", "0")// 从 POST 请求的表单数据中获取 "name" 参数name := c.PostForm("name")// 从 POST 请求的表单数据中获取 "message" 参数message := c.PostForm("message")// 打印获取到的参数值到标准输出fmt.Printf("id: %s; page: %s; name: %s; message: %s\n", id, page, name, message)})// 启动 HTTP 服务器,监听 8080 端口router.Run(":8080")
}
效果

相关文章:
Gin框架操作指南06:POST绑定(下)
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:没用过Gin的读者强烈建议先阅读第一节:Gin操作指南:开山篇。 本节继续演示POST绑定,包括将request-body绑定到不同的结构体中&#x…...
LLaMA、llama.cpp和Ollama区别
LLaMA:LLaMA是由Meta(Facebook的母公司)开源的大型语言模型,它提供了不同规模的模型,包括1B、3B、11B和90B等参数规模的版本。LLaMA模型支持多语言对话,并在多个基准数据集上进行了评估,展现出与…...
NDK开发
NDK介绍 app为什么会把代码放到so中 a) C语言历史悠久,有很多现成的代码可用 b) C代码执行效率比Java高 c) Java代码很容易被反编译,而且反编译以后的逻辑很清晰 为什么要学习NDK开发 在安卓的so开发中,其他基本与C/C开发一致ÿ…...
docker overlay 占用空间太大,迁移到 /data/
将 Docker 的 overlay 存储驱动迁移到 /data/ 目录下,可以通过以下步骤完成: 1. 停止 Docker 服务 首先,停止 Docker 服务以确保没有容器在运行,并且数据不会被写入到当前的存储位置。 sudo systemctl stop docker2. 备份现有数…...
Windows性能监控与调优:让电脑运行如飞
一、性能监控 1. 使用任务管理器深入监控 打开任务管理器 我们可以通过按下Ctrl Shift Esc快捷键来打开任务管理器。 或者右键点击任务栏空白处,选择“任务管理器”。 查看性能 在任务管理器中,点击“性能”标签页。 我们可以看到“概览”标签&#x…...
前端响应式布局
1.什么是响应式布局? 响应式布局是一种使网页在不同设备(如手机、平板和桌面)上均能良好显示的设计理念。 2.响应式布局的原理? 通过灵活的网格布局、CSS 媒体查询和弹性单位等技术,实现内容自适应屏幕尺寸变化。 3.响…...
力扣MySQL 1581
先把两张表连接,amount为null 的正是我们需要的,再按customer_id聚合 select Visits.visit_id,customer_id ,Transactions.visit_id ,transaction_id ,amount from Visits left join Transactions on Visits.visit_idTransactions.visit_id 正确代码&…...
就是这个样的粗爆,手搓一个计算器:科学计算器
作为程序员,没有合适的工具,就得手搓一个,PC端,移动端均可适用。废话不多说,直接上代码。 HTML: <div class"calculator"><div class"display-wrapper"><div class"display…...
wordpress使用popup弹窗插件的对比
您在寻找最好的 WordPress 弹出插件吗?大多数网站利用某种形状或形式的弹出窗口来将访问者指向他们希望他们去的地方。例如,这可能用于结帐、电子邮件订阅或用于生成潜在客户。 表现 弹出插件会减慢您的网站速度。当插件使用 WordPress 跟踪弹出窗口的…...
开源OpenStack
1.查询HCS基于OpenStack哪个版本开发 2.九大核心组件 OpenStack可以对接FC也可以对接KVM主机;(OpenStack 对接华为FusionCompute,一个集群对应 openstack 一台计算主机)-引申出nova compute 2.1nova nova两个核心组件nova contro…...
基于Spring Boot+vue技术的导游系统设计与实现
论文下载【免费】基于SpringBootvue技术的导游系统设计与实现资源-CSDN文库 摘 要 本研究背景主要聚焦于当前旅游业信息化、智能化的发展趋势。随着移动互联网的普及和人们出行方式的多样化,导游系统作为旅游服务的重要组成部分,亟需进行技术革新以提…...
软件测试 —— 灰度测试及测试流程!
软件测试中的灰度测试是一种结合了黑盒测试和白盒测试特点的测试方法,旨在通过逐步扩大测试范围来评估新系统或新功能在真实环境中的性能和稳定性。灰度测试是软件开发过程中的一个重要环节,它有助于在全面发布前发现并修复潜在问题,同时收集…...
中科星图GVE(案例)——AI实现光伏面板提取
目录 简介 函数 gve.Services.AI.solarExtraction(image) 代码 结果 知识星球 机器学习 简介 光伏面板提取是一种将光伏面板从图像或视频中准确地分割出来的任务,可以通过使用深度学习算法来实现。 以下是一种基于深度学习的光伏面板提取的实现步骤&#x…...
一种压缩QRCode矩阵以用于存储的方法
通常QRCode由服务器生成,以图片格式发送到客户端,由客户端直接展示,也可以由客户端使用javascript或其他内置的SDK直接生成。 0、需求 QRCode生成过程中往往是先生成矩阵,然后使用矩阵生成图片,矩阵就是由01组成的一…...
鸿蒙HarmonyOS开发:系统服务
拨打电话 call.makeCall 跳转到拨号界面,并显示待拨出的号码。使用callback异步回调。 makeCall(phoneNumber: string, callback: AsyncCallback<void>): voidimport { call } from kit.TelephonyKit;import { BusinessError } from kit.BasicServicesKit;c…...
【Go】GO语言知识总结浅析
Go语言是一种现代化的编程语言,由Google于2007年设计并于2009年发布。它旨在使编程变得简单、高效,并且可以在多核处理器上轻松构建高性能应用。Go语言的编程思想、发展历史、版本特点、运行原理、数据类型、应用场景,以及在web开发、网络编程…...
GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测(Maltab)
GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测(Maltab) 目录 GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测(Maltab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现灰狼算法OOA-Transf…...
上市公司企业供应链抵抗力数据集(2012-2023年)
一、测算方式:参考《财经研究》张树山(2024)老师的做法,供应链抵抗力(Resis)体现了供应链运行状态的稳定性,即在应对外部扰动时,供应链仍能维持循环畅通。本文从稳固供应链关系来筛选…...
javaWeb项目-ssm+jsp-XX牙科诊所管理系统功能介绍
本项目源码(点击下方链接下载):java-ssmjsp私人牙科诊所管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端&…...
tcp_rmem中有三个值4896 131072 6291456是什么意思,有什么作用?
在 TCP 中,tcp_rmem参数的三个值分别具有以下含义和作用: 一、含义 “4896”: 通常代表 TCP 接收缓冲区的最小大小。这是接收端为接收数据预先分配的最小内存空间。当网络中数据量较小时,这个最小缓冲区可以确保有足够的空间来存储…...
ComfyUI-Manager终极指南:3个核心功能彻底解决AI工作流管理难题
ComfyUI-Manager终极指南:3个核心功能彻底解决AI工作流管理难题 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable vari…...
别再死记硬背了!用Multisim仿真+图解,5分钟搞懂三极管共射放大电路工作原理
用Multisim仿真图解5分钟掌握三极管共射放大电路三极管共射放大电路是电子技术中最基础也最关键的电路之一,但传统教材中复杂的公式推导和静态图解往往让初学者望而生畏。本文将带你用Multisim仿真软件,通过可视化的方式直观理解电路工作原理,…...
放弃编码器!纯靠MPU6050和PID算法,手把手教你用TT马达实现平衡小车稳定控制(STM32F103C8T6实战)
纯MPU6050STM32F103的TT马达平衡车实战:无编码器PID控制全解析当大多数平衡小车方案都在强调编码器对速度反馈的不可或缺性时,我们决定挑战一个更极简的配置:仅用5美元的TT马达、9轴的MPU6050和STM32F103C8T6最小系统板,完全舍弃编…...
OpenClaw用户如何快速接入Taotoken并开始Agent工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 OpenClaw用户如何快速接入Taotoken并开始Agent工作流 对于使用OpenClaw框架构建AI智能体的开发者而言,快速接入稳定、多…...
VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南
一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0(2026 年 5 月发布)是 vSphere 9.1 核心组件,聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向,重点强化 NVMe 存储与网卡生态适配,以下为关键更新&am…...
GEO生成引擎优化:当AI成为信息分发的主角,品牌如何抢占对话窗口?
当用户不再"搜索-浏览",而是直接"AI提问-获取答案",传统SEO的逻辑正在被彻底改写。2026年,GEO(Generative Engine Optimization,生成式引擎优化)已经从概念走向规模化落地。本文从技术…...
Claude端到端测试设计终极清单:覆盖17类非功能需求(含延迟敏感度分级、幻觉熔断阈值、多轮对话状态持久化验证)
更多请点击: https://kaifayun.com 第一章:Claude端到端测试设计的演进逻辑与核心范式 Claude端到端测试并非静态产物,而是随模型能力边界拓展、交互场景复杂化及可靠性要求升级而持续演化的工程实践。其演进逻辑根植于三个关键张力…...
GEO优化可以覆盖哪些搜索平台
这是一个非常现实的问题。企业投放资源做GEO,当然希望覆盖面越广越好。那么GEO优化到底能覆盖哪些平台?覆盖到什么程度?不同平台的GEO逻辑有什么差异?GEO平台覆盖的三个层级第一层级:通用大模型AI平台(核心…...
从科研图表到商业报表:如何用Matplotlib的legend()提升你的图表专业度?
从科研图表到商业报表:如何用Matplotlib的legend()提升你的图表专业度? 在数据驱动的决策时代,图表不仅是科研论文中的证据载体,更是商业汇报中的说服工具。我曾见证一位生物统计学家将同一组临床试验数据呈现给三种不同受众&…...
qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用
qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl 在数字音乐时代,追求极致音质的音…...
