请求绑定
buffalo.Context
接口有一个名为的Bind
方法,此方法允许将请求中的数据(例如请求中的get参数,表单数据,post中的参数、post中的json内容)绑定映射到结构中,方便在action中使用这些结构数据。
更多信息参考github.com/gobuffalo/buffalo/binding
它是如何工作的?
该Bind
函数通过查看请求Content-Type
或Accept
标头以及查找binding.Binder
接口的映射实现来工作。
映射HTML内容
application/html
text/html
application/x-www-form-urlencoded
multipart/form-data
html
-
映射JSON内容
application/json
text/json
json
映射XML内容
application/xml
text/xml
xml
表单绑定
下面是一个将User结构和表单绑定的样例:
type User struct {
Name string `form:"name"`
Email string
Password string `form:"-"`
}
<form>
<input type="text" value="ringo" name="name"/>
<input type="text" value="ringo@beatles.com" name="Email"/>
<input type="text" value="starr" name="Password"/>
<input type="submit"/>
</form>
在action中就可以使用绑定方法了:
func UserInsert(c buffalo.Context) error {
u := &User{}
if err := c.Bind(u); err != nil {
return err
}
u.Name // "Ringo"
u.Email // "ringo@beatles.com"
u.Password // ""
// do more work
}
表单和结构之间的映射是在结构体中定义的。如果结构体中有form定义,就会使用form中定义的名称,如上面User结构中的Name对应的name,如果没有定义form,就会默认使用结构的字段名,如User结构中的Email,表单中也需要是首字母大写的Email。同时也可以通过在form中定义"-"来表示,在表单中忽略这个字段的映射,如User结构中的Password。
JSON和XML绑定
默认情况下,使用标准库中的encoding/json
和encoding/xml
包绑定JSON和XML请求。
下面是一个从json数据中获取User数据的样例(xml也同,结构定义中的tag也相应改为xml)
type User struct {
Name string `json:"name"`
Email string `json:"email"`
Password string `json:"-"`
}
{
"name": "Ringo",
"email": "ringo@beatles.com",
"password": "starr"
}
在这个例子中,我们可以将此JSON有效内容绑定到User
结构,如下所示:
func MyAction(c buffalo.Context) error {
u := &User{}
if err := c.Bind(u); err != nil {
return err
}
u.Name // "Ringo"
u.Email // "ringo@beatles.com"
u.Password // ""
// do more work
}
有关在结构体中标记json
和xml
的更多信息,请参阅标准库文档。