3-gin資料解析和繫結
阿新 • • 發佈:2021-12-01
一 Json 資料解析和繫結
客戶端傳參,後端接收並解析到結構體定
package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定義接收資料的結構體 type Login struct { // binding:"required"修飾的欄位,若接收為空值,則報錯,是必須欄位 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.建立路由 r := gin.Default() // JSON繫結 r.POST("loginJSON", func(c *gin.Context) { // 宣告接收的變數 var json Login // 將request的body中的資料,自動按照json格式解析到結構體(只能解析json格式) if err := c.ShouldBindJSON(&json); err != nil { // 返回錯誤資訊 // gin.H封裝了生成json資料的工具 c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判斷使用者名稱密碼是否正確 if json.User != "lqz" || json.Pssword != "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "304", "msg": "使用者名稱或密碼錯誤"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run(":8080") }
二 表單資料解析和繫結
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) // 定義接收資料的結構體 type Login struct { // binding:"required"修飾的欄位,若接收為空值,則報錯,是必須欄位 User string `form:"user" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.建立路由 r := gin.Default() // JSON繫結 r.POST("loginJSON", func(c *gin.Context) { // 宣告接收的變數 var json Login // Bind()預設解析並繫結form格式,根據請求頭中content-type自動推斷 //urlencoded,json,form-data格式都支援 if err := c.Bind(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判斷使用者名稱密碼是否正確 fmt.Println(json.Pssword,json.User) if json.User != "lqz" || json.Pssword != "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "304", "msg": "使用者名稱或密碼錯誤"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run(":8080") }
三 URI資料解析和繫結
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) // 定義接收資料的結構體 type Login struct { // binding:"required"修飾的欄位,若接收為空值,則報錯,是必須欄位 User string `form:"user" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.建立路由 r := gin.Default() // JSON繫結 r.GET("/:user/:password", func(c *gin.Context) { // 宣告接收的變數 var json Login // 解析並繫結路徑中的引數 if err := c.ShouldBindUri(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判斷使用者名稱密碼是否正確 fmt.Println(json.Pssword,json.User) if json.User != "lqz" || json.Pssword != "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "304", "msg": "使用者名稱或密碼錯誤"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run(":8080") }
四 ShouldBind
ShouldBind
會按照下面的順序解析請求中的資料完成繫結:
- 如果是
GET
請求,只使用Form
繫結引擎(query
)。 - 如果是
POST
請求,首先檢查content-type
是否為JSON
或XML
,然後再使用Form
(form-data
)
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
// 定義接收資料的結構體
type Login struct {
// binding:"required"修飾的欄位,若接收為空值,則報錯,是必須欄位
User string `form:"user" json:"user" uri:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func main() {
router := gin.Default()
// 繫結JSON的示例 ({"user": "lqz", "password": "123"})
router.POST("/loginJSON", func(c *gin.Context) {
var login Login
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 繫結form表單示例 (user=lqz&password=123)
router.POST("/loginForm", func(c *gin.Context) {
var login Login
// ShouldBind()會根據請求的Content-Type自行選擇繫結器
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 繫結QueryString示例 (127.0.0.1:8080/loginForm/?user=lqz&password=123)
router.GET("/loginForm", func(c *gin.Context) {
var login Login
// ShouldBind()會根據請求的Content-Type自行選擇繫結器
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
router.Run(":8080")
}