mirror of
https://github.com/labstack/echo.git
synced 2024-12-24 20:14:31 +02:00
Add field name in Error message when Binding type mismatch
Old error message ` Unmarshal type error: expected=int, got=string, offset=47 ` New error message ` Unmarshal type error: expected=int, got=string, field=age, offset=47 ` Make it easy to fix for client.
This commit is contained in:
parent
f867058e3b
commit
d36ff72961
2
bind.go
2
bind.go
@ -44,7 +44,7 @@ func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) {
|
|||||||
case strings.HasPrefix(ctype, MIMEApplicationJSON):
|
case strings.HasPrefix(ctype, MIMEApplicationJSON):
|
||||||
if err = json.NewDecoder(req.Body).Decode(i); err != nil {
|
if err = json.NewDecoder(req.Body).Decode(i); err != nil {
|
||||||
if ute, ok := err.(*json.UnmarshalTypeError); ok {
|
if ute, ok := err.(*json.UnmarshalTypeError); ok {
|
||||||
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unmarshal type error: expected=%v, got=%v, offset=%v", ute.Type, ute.Value, ute.Offset))
|
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unmarshal type error: expected=%v, got=%v, field=%v, offset=%v", ute.Type, ute.Value, ute.Field, ute.Offset))
|
||||||
} else if se, ok := err.(*json.SyntaxError); ok {
|
} else if se, ok := err.(*json.SyntaxError); ok {
|
||||||
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Syntax error: offset=%v, error=%v", se.Offset, se.Error()))
|
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Syntax error: offset=%v, error=%v", se.Offset, se.Error()))
|
||||||
} else {
|
} else {
|
||||||
|
17
bind_test.go
17
bind_test.go
@ -208,6 +208,23 @@ func TestBindbindData(t *testing.T) {
|
|||||||
assertBindTestStruct(t, ts)
|
assertBindTestStruct(t, ts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBindUnmarshalTypeError(t *testing.T) {
|
||||||
|
body := bytes.NewBufferString(`{ "id": "text" }`)
|
||||||
|
e := New()
|
||||||
|
req := httptest.NewRequest(POST, "/", body)
|
||||||
|
req.Header.Set(HeaderContentType, MIMEApplicationJSON)
|
||||||
|
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
c := e.NewContext(req, rec)
|
||||||
|
u := new(user)
|
||||||
|
|
||||||
|
err := c.Bind(u)
|
||||||
|
|
||||||
|
he := &HTTPError{Code: http.StatusBadRequest, Message: "Unmarshal type error: expected=int, got=string, field=id, offset=14"}
|
||||||
|
|
||||||
|
assert.Equal(t, he, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBindSetWithProperType(t *testing.T) {
|
func TestBindSetWithProperType(t *testing.T) {
|
||||||
ts := new(bindTestStruct)
|
ts := new(bindTestStruct)
|
||||||
typ := reflect.TypeOf(ts).Elem()
|
typ := reflect.TypeOf(ts).Elem()
|
||||||
|
Loading…
Reference in New Issue
Block a user