Fork me on GitHub

Go语言Gin-2.数据传输

3.gin数据解析和 绑定

3.1 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"`
    	Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
    }
    
    func main() {
    	// 1.创建路由
    	// 默认使用了2个中间件Logger() ,Recovery()
    	r := gin.Default()
    	// JSON绑定
    	r.POST("/loginJSON", func(c *gin.Context) {
    		var json Login
    		if err := c.ShouldBindJSON(&json); err!=nil {
    			// 返回错误信息
    			// gin.H 封装了生成json数据的工具
    			c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()})
    			return
    		}
    		// 判断用户名和密码是否正确
    		if json.User != "root" || json.Password != "admin" {
    			c.JSON(http.StatusBadRequest, gin.H{"status":"304"})
    			return
    		}
    		c.JSON(http.StatusOK, gin.H{"status":200})
    	})
    	r.Run(":8000")
    }
    
  • 发送请求:

    xujunkai@adeMacBook-Pro ~ % curl http://127.0.0.1:8000/loginJSON -H 'content-type:application/json' -d {"user":"root","password":"admin"} -X POST         
    // 返回错误,因为发送数据没有进行json转换字符串:
    {"error":"invalid character 'u' looking for beginning of value"}
    // 当发送数据类型json str 就可以了
    xujunkai@adeMacBook-Pro ~ % curl http://127.0.0.1:8000/loginJSON -H 'content-type:application/json' -d "{\"user\":\"root\",\"password\":\"admin\"}" -X POST
    {"status":200}% 
    

3.2表单数据解析和绑定

  • html片段

    <body>
        <form action="http://localhost:8000/loginForm" method="post" enctype="application/x-www-form-urlencoded">
            用户名<input type="text" name="username"><br>
            密码<input type="password" name="password">
            <input type="submit" value="提交">
        </form>
    </body>
    
  • 后端代码

    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"`
    	Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
    }
    
    func main() {
    	// 1.创建路由
    	// 默认使用了2个中间件Logger() ,Recovery()
    	r := gin.Default()
    	// JSON绑定
    	r.POST("/loginForm", func(c *gin.Context) {
    		var form Login
    		// Bind() 默认解析并绑定form格式
    		// 根据请求头content_type自动推断
    		if err := c.Bind(&form); err!=nil {
    			// 返回错误信息
    			// gin.H 封装了生成json数据的工具
    			c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()})
    			return
    		}
    		// 判断用户名和密码是否正确
    		if form.User != "root" || form.Password != "admin" {
    			c.JSON(http.StatusBadRequest, gin.H{"status":"304"})
    			return
    		}
    		c.JSON(http.StatusOK, gin.H{"status":200})
    	})
    	r.Run(":8000")
    }
    

    效果展示:

    ![43099DE2-AAA8-4E0A-952E-C465C6C50C68](/Users/xujunkai/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/874524334/QQ/Temp.db/43099DE2-AAA8-4E0A-952E-C465C6C50C68.png)

3.3URL数据解析和绑定

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"`
	Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func main() {
	// 1.创建路由
	// 默认使用了2个中间件Logger() ,Recovery()
	r := gin.Default()
	// JSON绑定
	r.GET("/:user/:password", func(c *gin.Context) {
		var login Login
		// 解析URL上面参数
		if err := c.ShouldBindUri(&login); err!=nil {
			// 返回错误信息
			// gin.H 封装了生成json数据的工具
			c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()})
			return
		}
		// 判断用户名和密码是否正确
		if login.User != "root" || login.Password != "admin" {
			c.JSON(http.StatusBadRequest, gin.H{"status":"304"})
			return
		}
		c.JSON(http.StatusOK, gin.H{"status":200})
	})
	r.Run(":8000")
}
  • 访问URL:http://127.0.0.1:8000/root/admin
posted @ 2020-07-19 22:26  是阿凯啊  阅读(771)  评论(0编辑  收藏  举报