友好的参数校验。。。更新中

最近用gin写一个增删改查接口
就是参数校验提示感觉写的很难受 没有laravel 那样顺滑

 if err := c.ShouldBindJSON(&json); err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    return
}

返回

{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"}

用户看不懂

if user.Name == "" {
  c.JSON(http.StatusBadRequest, gin.H{"error": "请输入用户名称"})
  return
}

这样对程序比较易懂,但是加大工作量

我利用了反射机制自己弄了提示的

package main

import (
    "errors"
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "net/http"
    "reflect"
    "strings"
)

type User struct {
    gorm.Model
    Name  string `json:"name" binding:"required" required:"请输入用户名称"`
    Email string `json:"email" binding:"required,email" required:"请输入邮箱" email:"请输入正确的邮箱"`
}

// ValidateErr 错误校验
func ValidateErr(obj any, err error) error {
    if errs, ok := err.(validator.ValidationErrors); ok {
        var errMsg []string
        for _, e := range errs {
            field, ok := reflect.TypeOf(obj).FieldByName(e.Field())
            tag := e.Tag()
            if ok {
                if e2 := field.Tag.Get(tag); e2 != "" {
                    errMsg = append(errMsg, e2)
                }
            }
        }
        return errors.New(strings.Join(errMsg, ","))
    }
    return err
}

func main() {
    // 连接数据库
    dsn := "root:root@tcp(127.0.0.1:3306)/gin?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // 自动迁移表结构
    db.AutoMigrate(&User{})
    // 创建Gin实例
    r := gin.Default()
    // 添加用户
    r.POST("/users", func(c *gin.Context) {
        var user User
        fmt.Println("err", err, "err")
        if err := c.ShouldBindJSON(&user); err != nil {
            if ok := ValidateErr(user, err); ok != nil {
                c.JSON(http.StatusBadRequest, gin.H{"error": ok.Error()})
                return
            }
        }
        db.Create(&user)
        c.JSON(http.StatusOK, user)
    })
    // 启动服务
    if err := r.Run(":8080"); err != nil {
        panic(err)
    }
}

但是这种反射机制性能不太好

更新中。。。。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!