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 = `{