请求绑定

buffalo.Context接口有一个名为的Bind方法,此方法允许将请求中的数据(例如请求中的get参数,表单数据,post中的参数、post中的json内容)绑定映射到结构中,方便在action中使用这些结构数据。

更多信息参考github.com/gobuffalo/buffalo/binding

它是如何工作的?

Bind函数通过查看请求Content-TypeAccept标头以及查找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/jsonencoding/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
}

有关在结构体中标记jsonxml的更多信息,请参阅标准库文档。

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
superwen
讨论数量: 0
发起讨论 只看当前版本


暂无话题~