• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Revel 参数绑定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Revel 尽可能让客户端传来的参数转换成Go语言的数据类型变得简单。这种从字符串转换成另外一种类型被称为“数据绑定”。

参数

所有的请求参数被收集到一个单独的 Params 对象中. 包括:

  • URL 路径参数
  • URL 查询参数
  • 表单字段 (Multipart or not)
  • 文件上传

Params对象定义在 (godoc)中:

type Params struct {
    url.Values
    Files map[string][]*multipart.FileHeader
}

嵌入的 url.Values (godoc) 提供了简单值的查询支持, 但是开发者可以更方便的使用Revel的数据绑定支持,提取参数到任意的数据类型。

控制器方法参数绑定

参数可以直接绑定到控制器方法,例如:

func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result {
    ...
}

在控制器方法执行之前, Revel 通过变量名称绑定器解析参数到指定的数据类型,如果解析参数失败, 参数将被解析到目标数据类型的初始值。

绑定器

使用 Revel 的绑定器绑定一个参数到指定的数据类型 (godoc),它集成了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

数据类型绑定的语法描述如下,详细内容描述也可以参考 源代码

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官方模式 简单的添加时间格式到 TimeFormats 变量:

func init() {
    revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}

文件上传

文件上传参数可以绑定到以下几种类型:

  • *os.File
  • []byte
  • io.Reader
  • io.ReadSeeker

它是 Go的 multipart 包 的一个包装器. 文件保存在内存中,如果文件大小超过10MB(默认值), 就会被保存到一个临时文件中。

注意: 绑定 os.File类型,会保存到临时文件 (如果没有的话),所以效率低。

自定义绑定器

应用程序可以定义绑定器。

自定义绑定器需要实现 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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Revel 参数验证发布时间:2022-02-02
下一篇:
Revel 缓存Cache发布时间:2022-02-02
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap