请求数据参数绑定
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type
识别请求数据类型并利用反射机制自动提取请求中QueryString
、form表单
、JSON
、XML
等参数到结构体中。
在 Go 中,通过反射解析数据都是存放在结构体中,所以我们先定义一个结构体用来接受数据,如下:
type Login struct{
User string `form:"username" json:"username" xml:"username" binding:"required"`
Password string `form:"username" json:"username" xml:"username" binding:"required"`
}
1
2
3
4
2
3
4
其中 :
- form:会去解析 form 表单数据
- json:会去解析 json 格式数据
- xml:会去解析 xml 格式数据
- binding:required 表示设置的参数是必须参数,如果没有传就会报错
# 解析 JSON 数据
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct{
User string `form:"username" json:"username" xml:"username" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
func main(){
// 1、创建路由
g := gin.Default()
// 2、绑定路由规则
g.POST("/loginJSON", func(context *gin.Context) {
var login Login
// 对参数进行绑定
if err := context.ShouldBindJSON(&login);err != nil{
// 如果有错误返回JSON数据
context.JSON(304,gin.H{"status": err.Error()})
}
// 如果没有报错,取值并返回
context.JSON(200,gin.H{
"status": http.StatusOK,
"username": login.User,
"password": login.Password,
})
})
g.Run(":8000")
}
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
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
测试看结果:
(1)、正常请求
(2)、错误请求
# 解析 Form 表单
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct{
User string `form:"username" json:"username" xml:"username" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
func main(){
// 1、创建路由
g := gin.Default()
// 2、绑定路由规则
g.POST("/loginFORM", func(context *gin.Context) {
var login Login
// 对参数进行绑定
if err := context.ShouldBind(&login);err != nil{
// 如果有错误返回JSON数据
context.JSON(304,gin.H{"status": err.Error()})
}
// 如果没有报错,取值并返回
context.JSON(200,gin.H{
"status": http.StatusOK,
"username": login.User,
"password": login.Password,
})
})
g.Run(":8000")
}
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
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
# 解析 URL 数据
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct{
User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
}
func main(){
// 1、创建路由
g := gin.Default()
// 2、绑定路由规则
g.GET("/:username/:password", func(context *gin.Context) {
var login Login
// 对参数进行绑定
if err := context.ShouldBindUri(&login);err != nil{
// 如果有错误返回JSON数据
context.JSON(304,gin.H{"status": err.Error()})
}
// 如果没有报错,取值并返回
context.JSON(200,gin.H{
"status": http.StatusOK,
"username": login.User,
"password": login.Password,
})
})
g.Run(":8000")
}
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
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
# 解析 queryString 数据
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct{
User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
}
func main(){
// 1、创建路由
g := gin.Default()
// 2、绑定路由规则
g.GET("/login", func(context *gin.Context) {
var login Login
// 对参数进行绑定
if err := context.ShouldBind(&login);err != nil{
// 如果有错误返回JSON数据
context.JSON(304,gin.H{"status": err.Error()})
}
// 如果没有报错,取值并返回
context.JSON(200,gin.H{
"status": http.StatusOK,
"username": login.User,
"password": login.Password,
})
})
g.Run(":8000")
}
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
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
作者:
本文链接:https://jokerbai.com
版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!
上次更新: 2025/07/19, 09:17:41
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19