Я использую Go 1.17 с Gin и хочу реализовать проверку структуры перед отправкой данных в базу данных. Я взял пример из документации Gin.
В структуре мы можем объявить разные теги для проверки поля следующим образом:
type User struct {
FirstName string `json:"first_name" binding:"required"`
LastName string `json:"last_name" binding:"required"`
Age uint8 `json:"age" binding:"gte=0,lte=130"`
Email string `json:"email" binding:"required,email"`
FavouriteColor string `json:"favourite_color" binding:"iscolor"`
}
И в обработчике я могу получить ошибку следующим образом:
var u User
if err := c.ShouldBindWith(&u, binding.Query); err == nil {
c.JSON(http.StatusOK, gin.H{"message": "Good Job"})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
Сообщение об ошибке будет таким:
{
"error": "Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'User.LastName' Error:Field validation for 'LastName' failed on the 'required' tag\nKey: 'User.Email' Error:Field validation for 'Email' failed on the 'required' tag\nKey: 'User.FavouriteColor' Error:Field validation for 'FavouriteColor' failed on the 'iscolor' tag"
}
Сообщения об ошибках слишком многословны. Как можно вернуть пользователю лучшую ошибку? Я хотел бы смоделировать ответ json, например:
{
"errors": [
"first_name": "This field is required",
"last_name": "This field is required",
"age": "This field is required",
"email": "Invalid email"
]
}
Есть ли способ получить имя тега структуры json в значении поля? Например, как вы можете видеть в поле
FirstName
, я назвал свой json-тегfirst_name
. Я проверил документ pkg.go.dev/github.com/go-playground/validator/v10#FieldError и методfe.Field()
должен работать, но на самом деле у меня такое же поведение, как уfe.StructField()
. не знаю почему@John, чтобы получить разные результаты, используйте
RegisterTagNameFunc
Оууу, ты снова спасаешь мой день. Я думал, что это автоматически. Я помещу это в это условие:
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {