【gin】模型绑定、参数验证及文件上传go案例演示

server/2025/1/17 7:29:48/

Gin 框架参数绑定与验证

在开发 Web 应用时,通常需要处理来自客户端的请求数据。Gin 提供了强大的 请求绑定(Binding)参数验证(Validation) 功能。

1. Gin 请求数据绑定

Gin 使用 ShouldBindShouldBindJSON 等方法来将请求中的数据绑定到 Go 结构体中。根据请求的 Content-Type,Gin 会自动选择合适的绑定方式。

常见绑定方法:

  • ShouldBindJSON:用于绑定 application/json 格式的请求体。

  • ShouldBind:是一个通用绑定方法,能够根据请求类型(如 application/jsonapplication/x-www-form-urlencoded)自动选择合适的绑定方式。

  • c.Param:用于获取 URL 路径中的参数(如 /course/:id)。
    在这里插入图片描述

  • c.Query:用于获取 URL 查询参数(如 /course?id=1)。
    在这里插入图片描述

2. Gin 参数验证

Gin 提供了参数验证功能,通过 验证标签 来约束结构体字段的值。结构体中的字段可以使用标签来进行验证,如 requiredemailnumber 等。

常见验证标签:

标签说明
required表示该字段是 必填 的,不能为空
omitempty表示该字段是 可选 的,如果请求中没有提供该字段,则不验证
alphaunicode该字段只能包含 字母和 Unicode 字符
number该字段必须是一个 数字
e164该字段必须符合 E.164 国际电话号码格式
email该字段必须是有效的 电子邮件地址

结构字段验证参考github

例子:

type user struct {Name   string `json:"name" binding:"required,alphaunicode"`Age    int    `json:"age" binding:"omitempty,number"`Phone  string `json:"phone" binding:"omitempty,e164"`Email  string `json:"email" binding:"omitempty,email"`
}
  • Name:要求字段不能为空,并且只能包含字母和 Unicode 字符。
  • Age:可选字段,要求是数字类型。
  • Phone:可选字段,要求符合 E.164 格式。
  • Email:可选字段,要求是有效的电子邮件地址。

3. Gin 的错误处理与返回

在验证过程中,Gin 会自动处理错误并返回相应的 HTTP 状态码和错误信息。

bind和shouldBind区别

  • Bind 不会根据请求类型返回错误,只要请求体能够成功转换为结构体,它就会执行绑定。
  • bind尝试绑定请求体到结构体,并且如果出错,会返回 HTTP 400 错误,并继续执行后续代码
  • 而shouldBind会返回500,不会继续执行

错误处理:

err := c.ShouldBind(&req)
if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return
}

1.使用bind情况
![在在这里插入图片描述
2.使用shouldbind
在这里插入图片描述

4. 文件上传

package uploadimport ("github.com/gin-gonic/gin""net/http"
)// Upload 上传单个文件
func Upload(c *gin.Context) {file, _ := c.FormFile("file") // 这里file指的是字段名dst := "upload_files/" + file.Filenamec.SaveUploadedFile(file, dst)c.JSON(http.StatusOK, gin.H{"file": file.Filename,})
}// UploadMultiple 上传多个文件
func UploadMultiple(c *gin.Context) {form, _ := c.MultipartForm()files := form.File["files"] // 从表单中获取文件,参数名为 "file"// 这是从请求中提取文件的函数。file 是前端表单中 <input type="file" name="file"> 的 name 属性值。// 通过 FormFile,我们可以获得上传文件的信息,比如文件名、大小、类型等。fileNames := make([]string, len(files))for i := 0; i < len(files); i++ {file := files[i]dst := "upload_files/" + file.Filenamec.SaveUploadedFile(file, dst) // 保存文件到指定路径fileNames[i] = file.Filename}c.JSON(http.StatusOK, gin.H{"files": fileNames,})
}

设置最大上传文件大小

package main  import (  "github.com/gin-gonic/gin"   "golang13-gin/routes"   
)func main() {   r := gin.Default()   r.MaxMultipartMemory = 8 << 20 // r.MaxMultipartMemory = 8 << 20 是设置 gin.Engine 的一个配置选项,控制上传文件时的最大内存限制。// 指的是单次上传内所有文件大小   routes.InitRoutes(r)   r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}

路由配置

package routesimport ("github.com/gin-gonic/gin""golang13-gin/upload"
)func InitUpload(group *gin.RouterGroup) {v1 := group.Group("v1"){v1.POST("/upload", upload.Upload)v1.POST("/uploadMulti", upload.UploadMultiple)}
}

https://github.com/0voice


http://www.ppmy.cn/server/159030.html

相关文章

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…

level(三) filterblock

filterblock用于确定某个key是否存在于某个datablock中&#xff0c;在插入一个key到datablock中时也会插入一个key到filterblock中&#xff0c;filterblock中会记录所有的key&#xff0c;并通过布隆过滤器来确定一个key是否存于这个datablock中。下面来看下filterblock的代码&a…

SQLite 3.48.0 发布,有哪些更新?

SQLite 开发团队于 2025 年 1 月 14 日发布了 SQLite 3.48.0 版本&#xff0c;我们来解读一下新版本的改进功能。 EXPLAIN QUERY PLAN SQLite 使用 EXPLAIN QUERY PLAN 命令获取查询语句的执行计划&#xff0c;新版本改进了执行计划输出结果中的覆盖索引优化信息&#xff1a;…

计算机的错误计算(二百一十三)

摘要 利用大模型计算 实验表明&#xff0c;其输出有 1位正确数字。 刚刚登录了一个新的大模型&#xff0c;之前从未使用过。本节将讨论该大模型在 IEEE 754-2019标准下函数计算的准确性。 例1. 计算 下面是与新的大模型的对话。 点评&#xff1a; &#xff08;1&#xff…

MySQL SQL优化技巧与原理

前言 随着业务数据量的不断增加&#xff0c;MySQL查询语句的执行效率对程序的运行效率影响逐渐增大。因此&#xff0c;进行SQL优化变得至关重要。本文将结合SQL的执行语句顺序和各种SQL场景&#xff0c;介绍一些常见的MySQL SQL优化技巧及其背后的原理。 一、MySQL SQL执行语…

smart_web 管理端说明

smart_web 操作手册 1. smart_web 是什么&#xff1f; smart_web 是 smart_rtmpd 的付费版本&#xff0c;拥有比免费版本更多的功能支持&#xff0c;基于 web 的管理方式&#xff0c;让您随时随地在大部分设备上都能远程对服务器进行维护管理。smart_web 带有进程守护&#x…

Windows上安装和配置Tabby终端工具并实现远程ssh连接内网服务器

文章目录 前言1. Tabby下载安装2. Tabby相关配置3. Tabby简单操作4. ssh连接Linux4.1 ubuntu系统安装ssh4.2 Tabby远程ssh连接ubuntu 5. 安装内网穿透工具5.1 创建公网地址5.2 使用公网地址远程ssh连接 6. 配置固定公网地址 前言 今天我要给大家分享一个非常实用且强大的开源跨…

npm 方式安装Pyodide 详解

npm 方式安装Pyodide 详解 如何通过 npm 安装 Pyodide 1. 安装 Pyodide 在您的项目中运行以下命令&#xff1a; npm install pyodide这将安装 Pyodide npm 包。 2. 在项目中使用 Pyodide 以下是如何在 JavaScript 或 TypeScript 项目中使用 npm 安装的 Pyodide&#xff1a;…