Skip to content

Suggest: How to Use Custom Binder #438

@iktakahiro

Description

@iktakahiro

I'd like to suggest that adding a practice to the document.

  • CustomBinder - Json Binding with validation
type ValidateBinder struct{}

func (ValidateBinder) Bind(i interface{}, c echo.Context) (err error) {
    rq := c.Request()
    ct := rq.Header().Get(echo.ContentType)
    err = echo.ErrUnsupportedMediaType
    if strings.HasPrefix(ct, echo.ApplicationJSON) {
        if err = json.NewDecoder(rq.Body()).Decode(i); err != nil {
            return
        }
        if tagName := c.Get("ValidateTagName"); tagName == nil {
            c.Set("ValidateTagName", "validate")
        }
        config := &validator.Config{TagName: c.Get("ValidateTagName").(string)}
        validate := validator.New(config)
        if err = validate.Struct(i); err != nil {
            return
        }
    }
    return
}
  • Set CustomBinder
e := echo.New()
e.SetBinder(&ValidateBinder{})
  • How to Use
type User struct {
    ID    int64     `json:"id" validate:"required"`
    Email string    `json:"email" validate:"required,email"`
}

func MyFunc() echo.HandlerFunc {
    return func(c echo.Context) (err error) {

            user := new(model.User)
            c.Set("ValidateTagName", "validate")

            if err = c.Bind(user); err != nil {
               return echo.NewHTTPError(fasthttp.StatusBadRequest, "Request parameters are invalid.")
            }
    }
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions