gin绑定表单数据与结构体遇到坑的一些总结

Some summary of gin binding form data and structure encounter pits

前言

最近在公司做某个项目的时候遇到了gin绑定表单数据与结构体的一些问题,困扰了挺久的,终于解决了,在此记录一下。

坑1 绑定表单字符串数组与结构体

form.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/" method="POST">
<p>Check some colors</p>
<label for="red">Red</label>
<input type="checkbox" name="colors[]" value="red" id="red" /><br/>
<label for="green">Green</label>
<input type="checkbox" name="colors[]" value="green" id="green" /><br/>
<label for="blue">Blue</label>
<input type="checkbox" name="colors[]" value="blue" id="blue" /><br/>

<label for="Student">Name:</label>
<input type="text" name="name" /><br/>

<label for="Student">Age:</label>
<input type="text" name="age" /><br />

<input type="submit" />
</form>
</body>
</html>

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"fmt"
"github.com/gin-gonic/gin"
)

type Student struct {
Name string `form:"name"`
Age int `form:"age"`
}

type myForm struct {
Colors []string `form:"colors[]"`
Students Student
}

func main() {
r := gin.Default()
r.LoadHTMLGlob("views/*")
r.GET("/", indexHandler)
r.POST("/", formHandler)
r.Run(":10000")
}

func indexHandler(c *gin.Context) {
c.HTML(200, "form.html", nil)
}

func formHandler(c *gin.Context) {
var fakeForm myForm
c.Bind(&fakeForm)
c.JSON(200, gin.H{
"color": fakeForm.Colors,
"students" : fakeForm.Students,
})
fmt.Println(fakeForm)
}

提交后的效果如下图,这里还是比较简单的。

image-20210204190356735

image-20210204190419952

坑2 绑定表单结构体数组

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

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

type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}

type myForm struct {
Students []Student `json:"students"`
}

func main() {
r := gin.Default()
r.LoadHTMLGlob("views/*")
r.GET("/", indexHandler)
r.POST("/test", formHandler)
r.Run(":10000")
}

func indexHandler(c *gin.Context) {
c.HTML(200, "form.html", nil)
}

func formHandler(c *gin.Context) {
var fakeForm myForm

if err := c.BindJSON(&fakeForm); err != nil {
//log.Fatal(err)
return
}
fmt.Println(fakeForm.Students)
c.JSON(http.StatusOK, fakeForm)

fmt.Println(fakeForm)
}

传入json即可

image-20210211234658717

Reference

go binding如何绑定结构体数组

Question: How bind JSON array

本文标题:gin绑定表单数据与结构体遇到坑的一些总结

文章作者:xianyu123

发布时间:2021年02月04日 - 18:55

最后更新:2021年02月12日 - 16:05

原始链接:http://0clickjacking0.github.io/2021/02/04/gin绑定表单数据与结构体遇到坑的一些总结/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------    本文结束  感谢您的阅读    -------------