友好的参数校验。。。更新中
最近用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 协议》,转载必须注明作者和本文链接