gin系列-参数绑定
程序员文章站
2023-12-31 15:13:58
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的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
总结
shouldbind会按照下面的顺序解析请求中的数据完成绑定:
如果是 get 请求,只使用 form 绑定引擎(query)。
如果是 post 请求,首先检查 content-type 是否为 json 或 xml,然后再使用 form(form-data)。