天天看点

Gin框架数据绑定和数据验证的使用方法

作者:GoGoer

Gin是一种基于Go语言的轻量级Web框架,它提供了一种简单、快速的方法来构建高性能的Web应用程序。其中一个重要的特性就是数据绑定,它可以将请求中的数据绑定到Go结构体中,从而方便处理和验证请求数据。

以JSON数据绑定为例,当客户端发送JSON格式的请求数据时,我们可以使用Gin的BindJSON方法将请求数据绑定到Go结构体中。具体代码如下:

前端代码:

{{define "user/bind_json.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON数据绑定</title>
    <script src="/static/js/jquery.min.js"></script>
</head>
<body>
    <form action="">
        <input type="text" id="name">
        <input type="password" id="password">
        <input type="button" id="btn_add" value="提交">
    </form>
    <script>
        var btn_add = document.getElementById("btn_add");
        btn_add.onclick = function(){
            var name = document.getElementById("name").value;
            var password = document.getElementById("password").value;
            $.ajax({
                url:"/bind_json_user",
                type:"POST",
                data:JSON.stringify({
                    "name":name,
                    "password":password,
                }),
                dataType:"json",
                contentType:"application/json",
                success:function(data){
                    alert(data["status"]);
                    alert(data["msg"]);
                },
                fail:function(data){
                    alert(data["error"])
                },
            })
        }
    </script>
</body>
</html>
{{end}}           

后端代码:

package main
import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
)
type User struct {
    Name     string `json:"name" binding:"required"`
    Password string `json:"password" `
}
func main() {
    r := gin.Default()
    r.LoadHTMLGlob("template/**/*")
    r.Static("/static", "./static")
    r.GET("/to_bind_json", func(c *gin.Context) {
        c.HTML(http.StatusOK, "user/bind_json.html", nil)
    })
    r.POST("/bind_json_user", func(c *gin.Context) {
        var user User
        //err := c.BindJSON(&user)
        err := c.ShouldBindJSON(&user)
        if err != nil {
            c.JSON(http.StatusOK, gin.H{
                "status": "error",
                "msg":    err.Error(),
            })
            return
        }
        // 处理请求数据
        fmt.Println(user)
        c.JSON(http.StatusOK, gin.H{
            "status": "success",
            "msg":    "成功",
        })
    })
    r.Run(":8080")
}           

在上面的代码中,我们首先定义了一个User结构体,然后在处理POST请求的回调函数中,使用ShouldBindJSON方法将请求数据绑定到user变量中。如果绑定失败,则返回错误信息,否则处理请求数据并返回成功状态。binding标签指定了该字段是否是必需的。或者缺少必需的字段,gin会返回一个错误,提示请求不合法。

Bindxxx与ShouldBindxxx的区别:

bind方法会在绑定参数出错时返回一个错误,解析错误会在head中添加400的返回信息。

shouldbind方法则不会返回错误,而是将错误信息存储在gin.Context的Error属性中,需要手动处理。

继续阅读