数据绑定与验证
go get github.com/go-macaron/binding
假设您有一个联系人信息的表单,其中姓名和信息为必填字段,则我们可以使用如下结构来进行表示:
type ContactForm struct {
Name string `form:"name" binding:"Required"`
Email string `form:"email"`
Message string `form:"message" binding:"Required"`
MailingAddress string `form:"mailing_address"`
}
然后通过 Macaron 增加如下路由:
m.Post("/contact/submit", binding.Bind(ContactForm{}), func(contact ContactForm) string {
return fmt.Sprintf("Name: %s\nEmail: %s\nMessage: %s\nMailing Address: %v",
contact.Name, contact.Email, contact.Message, contact.MailingAddress)
})
默认情况下,如果在验证过程中发生任何错误(例如:必填字段的值为空),binding 中间件就会直接向客户端返回错误信息,提前终止请求的处理。如果您不希望 binding 中间件自动终止请求的处理,则可以使用
binding.BindIgnErr
函数来忽略对错误的自动处理。默认情况下,
form
标签的名称使用以下命名约定:Name
->name
UnitPrice
->unit_price
也就是说,上面例子中的结构定义可以简化为如下代码:
type ContactForm struct {
Name string `binding:"Required"`
Email string
Message string `binding:"Required"`
MailingAddress string
}
超赞!有木有?
将指定
form
标签的地方替换为 json
,就可以完成对 JSON 数据的绑定。如果您希望传递接口而不是一个具体的结构,则可以使用如下方法:
m.Post("/contact/submit", binding.Bind(ContactForm{}, (*MyInterface)(nil)), func(contact MyInterface) {
// ... 您接收到的值为一个接口
})
原则上,每个处理器之间是相互独立的,但在特定情况下,它们之间会相互调用。
请求处理流程:
- 1.反序列化请求数据到结构
- 2.
- 3.