gin系列-參數綁定


為了能夠更方便的獲取請求相關參數,提高開發效率,我們可以基於請求的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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM