Skip to content

Binding errors no longer return a structured error response #2771

Open
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions