diff --git a/bind.go b/bind.go index 186bd83d..2d0af0c7 100644 --- a/bind.go +++ b/bind.go @@ -39,6 +39,9 @@ func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) { } return NewHTTPError(http.StatusBadRequest, "Request body can't be empty") } + if err = b.bindPathData(i, c); err != nil { + return NewHTTPError(http.StatusBadRequest, err.Error()) + } ctype := req.Header.Get(HeaderContentType) switch { case strings.HasPrefix(ctype, MIMEApplicationJSON): @@ -75,6 +78,19 @@ func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) { return } +func (b *DefaultBinder) bindPathData(ptr interface{}, c Context) error { + m := make(map[string][]string) + for _, key := range c.ParamNames() { + m[key] = []string{c.Param(key)} + } + if len(m) >= 0 { + if err := b.bindData(ptr, m, "param"); err != nil { + return err + } + } + return nil +} + func (b *DefaultBinder) bindData(ptr interface{}, data map[string][]string, tag string) error { typ := reflect.TypeOf(ptr).Elem() val := reflect.ValueOf(ptr).Elem() diff --git a/bind_test.go b/bind_test.go index 1f1fa486..cc7889e2 100644 --- a/bind_test.go +++ b/bind_test.go @@ -140,6 +140,23 @@ func TestBindForm(t *testing.T) { assert.Error(t, err) } +func TestBindRouteParam(t *testing.T) { + e := New() + r := strings.NewReader(userJSONOnlyName) + req := httptest.NewRequest(POST, "/", r) + req.Header.Set(HeaderContentType, MIMEApplicationJSON) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + c.SetParamNames("id") + c.SetParamValues("5") + u := new(user) + err := c.Bind(u) + if assert.NoError(t, err) { + assert.Equal(t, 5, u.ID) + assert.Equal(t, "Jon Snow", u.Name) + } +} + func TestBindQueryParams(t *testing.T) { e := New() req := httptest.NewRequest(GET, "/?id=1&name=Jon+Snow", nil) diff --git a/echo_test.go b/echo_test.go index a84d310d..e38d7c09 100644 --- a/echo_test.go +++ b/echo_test.go @@ -18,16 +18,17 @@ import ( type ( user struct { - ID int `json:"id" xml:"id" form:"id" query:"id"` + ID int `json:"id" xml:"id" form:"id" query:"id" param:"id"` Name string `json:"name" xml:"name" form:"name" query:"name"` } ) const ( - userJSON = `{"id":1,"name":"Jon Snow"}` - userXML = `1Jon Snow` - userForm = `id=1&name=Jon Snow` - invalidContent = "invalid content" + userJSON = `{"id":1,"name":"Jon Snow"}` + userJSONOnlyName = `{"name":"Jon Snow"}` + userXML = `1Jon Snow` + userForm = `id=1&name=Jon Snow` + invalidContent = "invalid content" ) const userJSONPretty = `{