Skip to content

Binding errors no longer return a structured error response #2771

@selda-tutti

Description

@selda-tutti

Issue Description

In earlier versions of echo, binding errors were serialized by DefaultHTTPErrorHandler into JSON. This has apparently changed with the commit fbfe216 fix(DefaultHTTPErrorHandler): return error message when message is an error because the error gets converted into a plain string message and included the "message" field here:

echo/echo.go

Line 452 in de44c53

message = Map{"message": m.Error()}

The following example shows that a binding error no longer returns a structured error response.

package main

import (
	"fmt"
	"net/http"
	"net/http/httptest"

	"github.com/labstack/echo/v4"
)

func GET(handler echo.HandlerFunc, target string) *httptest.ResponseRecorder {
	e := echo.New()
	rec := httptest.NewRecorder()
	req := httptest.NewRequest(http.MethodGet, target, nil)
	c := e.NewContext(req, rec)

	err := handler(c)
	if err != nil {
		e.DefaultHTTPErrorHandler(err, c)
	}
	return rec
}

func main() {
	handler := func(c echo.Context) error {
		var docNum int
		err := echo.PathParamsBinder(c).
			MustInt("docNum", &docNum).
			BindError()
		if err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, err)
		}
		return c.JSON(http.StatusOK, map[string]interface{}{"received": docNum})
	}
	resp := GET(handler, "/doc/1234")
	fmt.Println(resp.Body.String())
}

With v4.10.2:

go run main.go
{"field":"docNum","message":"required field value is empty"}

With v4.13.3:

go run main.go                              
{"message":"code=400, message=required field value is empty, field=docNum"}

If this change was on purpose and there is no aim to serialize binding errors, in this case the json tag in BindingError seems to be superfluous.

echo/binder.go

Line 71 in de44c53

Field string `json:"field"`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions