1. 程式人生 > 其它 >3-gin資料解析和繫結

3-gin資料解析和繫結

一 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會按照下面的順序解析請求中的資料完成繫結:

  1. 如果是 GET 請求,只使用 Form 繫結引擎(query)。
  2. 如果是 POST 請求,首先檢查 content-type 是否為 JSONXML,然後再使用 Formform-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")
}