友好的参数校验。。。更新中 
                                                    
                        
                    
                    
  
                    
                    最近用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 协议》,转载必须注明作者和本文链接
 
           ncccc1 的个人博客
 ncccc1 的个人博客
         
             
             
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: