zoukankan      html  css  js  c++  java
  • 3gin数据解析和绑定

    一 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")
    }
    
  • 相关阅读:
    03-架构设计的目的
    02-架构设计的历史背景
    01-架构到底是指什么
    python 基础 1.5 python数据类型(四)--字典
    python 基础 1.5 python数据类型(三)--元组常用方法示例
    python 基础 1.5 python数据类型(三)--元组
    python 基础 1.5 python数据类型(二)--列表常用方法示例
    python 基础 1.5 数据类型(二)--列表
    python 基础 1.5 python 数据类型(一)--整型 浮点型 布尔型及字符串和常用方法
    python 基础 1.4 python运算符
  • 原文地址:https://www.cnblogs.com/Henry121/p/15627424.html
Copyright © 2011-2022 走看看