Как в Go сделать нормально валидацию?

Как правильно валидировать GET-параметр? Если в page_size указывать число, то все в порядке: /articles?page_size=10. Но если передать строку /articles?page_size=test, то все валится в panic, и такую ошибку не обработать. Можно у PageSize поменять int на string, но тогда правило валидации min не работает (потому что min для строк - это валидация длины строки). Как вообще в Go разруливать такие ситуации?

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"net/http"
	"reflect"
)

func main() {
	g := gin.Default()
	g.GET("/articles", func(c *gin.Context) {
		type Paginator struct {
			PageSize int `form:"page_size" binding:"required,min=1"`
		}
		var pag Paginator
		if err := c.ShouldBindQuery(&pag); err != nil {
			errs := err.(validator.ValidationErrors)
			respErrors := make(map[string]interface{})
			for _, v := range errs {
				field, _ := reflect.TypeOf(&pag).Elem().FieldByName(v.Field())
				fieldName, _ := field.Tag.Lookup("form")
				respErrors[fieldName] = v.Tag()
			}
			c.JSON(http.StatusBadRequest, gin.H{"errors": respErrors})
			return
		}
		c.String(200, "Articles list is here")
	})
	g.Run(":9000")
}
  • Вопрос задан
  • 2005 просмотров
Решения вопроса 1
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы