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")
}
posted @ 2021-12-01 09:07  Henry121  阅读(161)  评论(0编辑  收藏  举报