3_请求参数绑定与多数据格式处理.md

Gin请求参数绑定与多数据格式处理

表单实体绑定(参数绑定)

​ 使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率:

type UserRegister struct {
Username string `form:"username" binding:"required"`
Phone string `form:"phone" binding:"required"`
Password string `form:"password" binding:"required"`
}

ShouldBindQuery()

使用ShouldBindQuery可以实现Get方式的数据请求的绑定。

func func3() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
fmt.Println(c.FullPath())
var student Student
// ShouldBind()会根据请求的Content-Type自行选择绑定器
err := c.ShouldBindQuery(&student)
if err != nil {
log.Fatal(err.Error())
}
c.Writer.Write([]byte("hello, " + student.Name + student.Classes))
})
r.Run("localhost:8000")
}
type Student struct {
Name string `form:"name"`
Classes string `form:"classes"`
}

ShouldBind()

使用ShouldBind可以实现Post方式的提交数据的绑定工作。

ShouldBindJson()

当客户端使用Json格式进行数据提交时,可以采用ShouldBindJson对数据进行绑定并自动解析

参数获取

获取querystring参数

DefaultQuery()

Query()

r.GET("/user/search", func(c *gin.Context) {
username := c.DefaultQuery("username", "小王子")
//username := c.Query("username")
address := c.Query("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})

获取form参数

PostForm()

username := c.PostForm("username")
address := c.PostForm("address")

获取json参数

r.POST("/json", func(c *gin.Context) {
// 注意:下面为了举例子方便,暂时忽略了错误处理
b, _ := c.GetRawData() // 从c.Request.Body读取请求数据
// 定义map或结构体
var m map[string]interface{}
// 反序列化
_ = json.Unmarshal(b, &m)
c.JSON(http.StatusOK, m)
})

请求的参数通过URL路径传递,例如:/user/search/小王子/沙河。 获取请求URL路径中的参数的方式如下。

func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.GET("/user/search/:username/:address", func(c *gin.Context) {
username := c.Param("username")
address := c.Param("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run(":8080")
}

Gin文件上传

单文件上传

文件上传前端页面代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>上传文件示例</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="f1">
<input type="submit" value="上传">
</form>
</body>
</html>

后端gin框架部分代码:

gin.Context.FormFile()

func main() {
router := gin.Default()
// 处理multipart forms提交文件时默认的内存限制是32 MiB
// 可以通过下面的方式修改
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("f1")
if err != nil {
c.JSON(302, gin.H{
"message": err.Error(),
})
return
}
fmt.Println(file.Filename)
dst := fmt.Sprintf("./%s", file.Filename)
c.SaveUploadedFile(file, dst)
c.JSON(200, gin.H{
"message": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})
router.LoadHTMLFiles("./index.html")
router.GET("/", func (c *gin.Context) {
c.HTML(200, "index.html", "")
})
router.Run("localhost:9000")
}

image-20210306163942794

多文件上传

gin.Context.MultipartForm()

router.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["file"]
for index, file := range files {
log.Println(file.Filename)
dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index)
// 上传文件到指定的目录
c.SaveUploadedFile(file, dst)
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("%d files uploaded!", len(files)),
})
})

本文作者:nsfoxer

本文链接:https://www.cnblogs.com/nsfoxer/p/16317575.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   nsfoxer  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起