当前位置: 首页 > article >正文

【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

例子:

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 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,
	})
}


设置最大上传文件大小

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 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


http://www.kler.cn/a/508742.html

相关文章:

  • arcgis提取不规则栅格数据的矢量边界
  • 记录一次 centos 启动失败
  • 数据库的DML
  • Flask学习入门笔记
  • cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】
  • Chapter1:初见C#
  • w163美食推荐商城
  • unity2022以上导出到AndroidStudio后更新步骤
  • 智能学习环境(Intelligent Learning Environment,ILE)
  • 如何发现架构中的耦合(5大场景)?(第36讲)
  • G1原理—10.如何优化G1中的FGC
  • 几种矩阵内积的定义和计算
  • git使用-合并代码查看是否冲突解决冲突
  • 基于springboot+vue.js+uniapp技术开发的一套大型企业MES生产管理系统源码,支持多端管理
  • 麒麟V10系统上安装Oracle
  • Golang:报错no required module provides package github.com/xx的解决方法
  • Oracle连接数满问题解决及排查 ORA-00020:maximumnumber of processes
  • 【人工智能】从Keras到TensorFlow 2.0:深入掌握Python深度学习技术
  • 【统计的思想】假设检验(一)
  • 如何在 Rocky Linux 上安装极狐GitLab?
  • stm32控制直流电机程序
  • 无限世界中的具身导航与交互!InfiniteWorld:通用视觉语言机器人交互的统一仿真框架
  • C++多态的认识与理解
  • doris: Flink导入数据
  • AI自动化编程:编程教育的变革之风
  • MarsCode青训营打卡Day1(2025年1月14日)|稀土掘金-16.最大矩形面积问题