Как правильно валидировать 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")
}