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

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

例子:

go 复制代码
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,不会继续执行

错误处理:

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

1.使用bind情况

![在

2.使用shouldbind

4. 文件上传

go 复制代码
package upload

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// Upload 上传单个文件
func Upload(c *gin.Context) {
	file, _ := c.FormFile("file") // 这里file指的是字段名
	dst := "upload_files/" + file.Filename
	c.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.Filename
		c.SaveUploadedFile(file, dst) // 保存文件到指定路径
		fileNames[i] = file.Filename
	}
	c.JSON(http.StatusOK, gin.H{
		"files": fileNames,
	})
}

设置最大上传文件大小

go 复制代码
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")




}

路由配置

go 复制代码
package routes

import (
	"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

相关推荐
stark张宇12 小时前
微服务架构必备:Gin + gRPC + Consul + Nacos + GORM 打造用户服务
微服务·gin·grpc
阿巴斯甜12 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker13 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952714 小时前
Andorid Google 登录接入文档
android
黄林晴15 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android