| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | package apiimport (	"github.com/gin-gonic/gin"	"github.com/gin-gonic/gin/binding"	"github.com/go-playground/locales/zh"	ut "github.com/go-playground/universal-translator"	val "github.com/go-playground/validator/v10"	zhTranslations "github.com/go-playground/validator/v10/translations/zh"	"log"	"net/http"	"reflect")func ErrHandler(c *gin.Context, err error) {	log.Println(err)	c.JSON(http.StatusInternalServerError, gin.H{		"message": err.Error(),	})}type ValidError struct {	Key     string	Message string}func BindAndValid(c *gin.Context, target interface{}) bool {	errs := make(map[string]string)	err := c.ShouldBindJSON(target)	if err != nil {		log.Println("raw err", err)		uni := ut.New(zh.New())		trans, _ := uni.GetTranslator("zh")		v, ok := binding.Validator.Engine().(*val.Validate)		if ok {			_ = zhTranslations.RegisterDefaultTranslations(v, trans)		}		verrs, ok := err.(val.ValidationErrors)		if !ok {			log.Println("verrs", verrs)			c.JSON(http.StatusNotAcceptable, gin.H{				"message": "Requested with wrong parameters",				"code":    http.StatusNotAcceptable,				"error":   verrs,			})			return false		}		for _, value := range verrs {			t := reflect.ValueOf(target)			realType := t.Type().Elem()			field, _ := realType.FieldByName(value.StructField())			errs[field.Tag.Get("json")] = value.Translate(trans)		}		c.JSON(http.StatusNotAcceptable, gin.H{			"errors":  errs,			"message": "Requested with wrong parameters",			"code":    http.StatusNotAcceptable,		})		return false	}	return true}
 |