参数绑定

最后更新于:2022-04-01 04:21:53

Revel 尽可能让客户端传来的参数转换成Go语言的数据类型变得简单。这种从字符串转换成另外一种类型被称为“数据绑定”。 ## 参数 所有的请求参数被收集到一个单独的 `Params` 对象中. 包括: * URL 路径参数 * URL 查询参数 * 表单字段 (Multipart or not) * 文件上传 Params对象定义在 ([godoc](http://gorevel.cn/docs/docs/godoc/params.html))中: ~~~ type Params struct { url.Values Files map[string][]*multipart.FileHeader } ~~~ 嵌入的 `url.Values` ([godoc](http://www.golang.org/pkg/net/url/#Values)) 提供了简单值的查询支持, 但是开发者可以更方便的使用Revel的数据绑定支持,提取参数到任意的数据类型。 ## 控制器方法参数绑定 参数可以直接绑定到控制器方法,例如: ~~~ func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result { ... } ~~~ 在控制器方法执行之前, Revel 通过变量名称绑定器解析参数到指定的数据类型,如果解析参数失败, 参数将被解析到目标数据类型的初始值。 ## 绑定器 使用 Revel 的绑定器绑定一个参数到指定的数据类型 ([godoc](http://gorevel.cn/docs/docs/godoc/binder.html)),它集成了Params对象。例如: ~~~ func (c SomeController) Action() revel.Result { var ids []int c.Params.Bind(&ids, "ids") ... } ~~~ 支持的数据类型有: * Int * Bool * Point * Slice * Struct * time.Time * 文件上传:*os.File, []byte, io.Reader, io.ReadSeeker 数据类型绑定的语法描述如下,详细内容描述也可以参考 [源代码](http://gorevel.cn/docs/docs/src/binder.html)。 ### Booleans 字符串 “true”, “on”, 和 “1” 被绑定到 **true**,其他的为 **false**. ### Slices 切片绑定有两种语法:有序和无序 有序: ~~~ ?ids[0]=1 &ids[1]=2 &ids[3]=4 ~~~ 绑定结果为 `[]int{1, 2, 0, 4}` 无序: ~~~ ?ids[]=1 &ids[]=2 &ids[]=3 ~~~ 绑定结果为 `[]int{1, 2, 3}` **注意:** 只有有序切片可以绑定到一个 []Struct: ~~~ ?user[0].Id=1 &user[0].Name=rob &user[1].Id=2 &user[1].Name=jenny ~~~ ### Struct Struct简单的使用一个 . 进行绑定: ~~~ ?user.Id=1 &user.Name=rob &user.Friends[]=2 &user.Friends[]=3 &user.Father.Id=5 &user.Father.Name=Hermes ~~~ 绑定到下面的struct类型: ~~~ type User struct { Id int Name string Friends []int Father User } ~~~ **注意:** struct中的字段必须是导出的(首字母大写)。 ### Date / Time 内置的 SQL 标准时间格式 [“2006-01-02”, “2006-01-02 15:04”] 使用 [Revel官方模式](http://golang.org/pkg/time/#pkg-constants) 简单的添加时间格式到 `TimeFormats` 变量: ~~~ func init() { revel.TimeFormats = append(revel.TimeFormats, "01/02/2006") } ~~~ ### 文件上传 文件上传参数可以绑定到以下几种类型: * *os.File * []byte * io.Reader * io.ReadSeeker 它是 [Go的 multipart 包](http://golang.org/pkg/mime/multipart/) 的一个包装器. 文件保存在内存中,如果文件大小超过10MB(默认值), 就会被保存到一个临时文件中。 **注意:** 绑定 `os.File`类型,会保存到临时文件 (如果没有的话),所以效率低。 ### 自定义绑定器 应用程序可以定义绑定器。 自定义绑定器需要实现 [binder](http://gorevel.cn/docs/docs/godoc/binder.html#Binder) 接口并注册自定义类型: ~~~ var myBinder = revel.Binder{ Bind: func(params *revel.Params, name string, typ reflect.Type) reflect.Value {...}, Unbind: func(output map[string]string, name string, val interface{}) {...}, } func init() { revel.TypeBinders[reflect.TypeOf(MyType{})] = myBinder ~~~
';