欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

gin系列-参数绑定

程序员文章站 2022-03-25 16:58:02
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。 下面的示例代码演示了.ShouldBind()强大的功能,它能够基于请求自动提取JSON、f ......

为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的content-type识别请求数据类型并利用反射机制自动提取请求中querystring、form表单、json、xml等参数到结构体中。 下面的示例代码演示了.shouldbind()强大的功能,它能够基于请求自动提取json、form表单和querystring类型的数据,并把值绑定到指定的结构体对象。

前端

#index.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>shouldbind</title>
</head>
<body>
<form action="/form" method="post">
    用户名:
    <input type="text" name="username">
    密码:
    <input type="password" name="password">
    <input type="submit" value="提交">
</form>
</body>
</html>

后端

#main.go
package main

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

type userinfo struct {
	username string `form:"username" json:"user"`
	password string `form:"password" json:"pass"`
}

func main() {
	r := gin.default()
	r.loadhtmlfiles("./index.html")
	r.get("/user", func(c *gin.context) {
		//username := c.query("username")
		//password := c.query("password")
		//u := userinfo{
		//	username: username,
		//	password: password,
		//}

		var u userinfo  //声明一个userinfo类型的变量u
		err := c.shouldbind(&u)  //?
		if err != nil {
			c.json(http.statusbadrequest, gin.h{
				"error": err.error(),
			})
		} else {
			fmt.printf("%#v\n",u)
			c.json(http.statusok, gin.h{
				"status":"ok",
			})
		}
	})

	r.get("/index", func(c *gin.context) {
		c.html(http.statusok,"index.html",nil)
	})

	r.post("/json", func(c *gin.context) {
		var u userinfo  //声明一个userinfo类型的变量u
		err := c.shouldbind(&u)  //?
		if err != nil {
			c.json(http.statusbadrequest, gin.h{
				"error": err.error(),
			})
		} else {
			fmt.printf("%#v\n",u)
			c.json(http.statusok, gin.h{
				"status":"ok",
			})
		}
	})
	//c.json(http.statusok,gin.h{
	//	"message": "ok",
	//})
	r.run(":9090")
}

验证

json:对应的是user、pass
gin系列-参数绑定
gin系列-参数绑定
gin系列-参数绑定
gin系列-参数绑定
总结

shouldbind会按照下面的顺序解析请求中的数据完成绑定:
如果是 get 请求,只使用 form 绑定引擎(query)。
如果是 post 请求,首先检查 content-type 是否为 json 或 xml,然后再使用 form(form-data)。