Revel 盡可能讓客戶端傳來的參數(shù)轉(zhuǎn)換成Go語言的數(shù)據(jù)類型變得簡單。這種從字符串轉(zhuǎn)換成另外一種類型被稱為“數(shù)據(jù)綁定”。
所有的請求參數(shù)被收集到一個單獨(dú)的 Params
對象中. 包括:
Params對象定義在 (godoc)中:
type Params struct {
url.Values
Files map[string][]*multipart.FileHeader
}
嵌入的 url.Values
(godoc) 提供了簡單值的查詢支持, 但是開發(fā)者可以更方便的使用Revel的數(shù)據(jù)綁定支持,提取參數(shù)到任意的數(shù)據(jù)類型。
參數(shù)可以直接綁定到控制器方法,例如:
func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result {
...
}
在控制器方法執(zhí)行之前, Revel 通過變量名稱綁定器解析參數(shù)到指定的數(shù)據(jù)類型,如果解析參數(shù)失敗, 參數(shù)將被解析到目標(biāo)數(shù)據(jù)類型的初始值。
使用 Revel 的綁定器綁定一個參數(shù)到指定的數(shù)據(jù)類型 (godoc),它集成了Params對象。例如:
func (c SomeController) Action() revel.Result {
var ids []int
c.Params.Bind(&ids, "ids")
...
}
支持的數(shù)據(jù)類型有:
數(shù)據(jù)類型綁定的語法描述如下,詳細(xì)內(nèi)容描述也可以參考 源代碼。
字符串 “true”, “on”, 和 “1” 被綁定到 true,其他的為 false.
切片綁定有兩種語法:有序和無序
有序:
?ids[0]=1
&ids[1]=2
&ids[3]=4
綁定結(jié)果為 []int{1, 2, 0, 4}
無序:
?ids[]=1
&ids[]=2
&ids[]=3
綁定結(jié)果為 []int{1, 2, 3}
注意: 只有有序切片可以綁定到一個 []Struct:
?user[0].Id=1
&user[0].Name=rob
&user[1].Id=2
&user[1].Name=jenny
Struct簡單的使用一個 . 進(jìn)行綁定:
?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中的字段必須是導(dǎo)出的(首字母大寫)。
內(nèi)置的 SQL 標(biāo)準(zhǔn)時間格式 [“2006-01-02”, “2006-01-02 15:04”]
使用 Revel官方模式 簡單的添加時間格式到 TimeFormats
變量:
func init() {
revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}
文件上傳參數(shù)可以綁定到以下幾種類型:
它是 Go的 multipart 包 的一個包裝器. 文件保存在內(nèi)存中,如果文件大小超過10MB(默認(rèn)值), 就會被保存到一個臨時文件中。
注意: 綁定 os.File
類型,會保存到臨時文件 (如果沒有的話),所以效率低。
應(yīng)用程序可以定義綁定器。
自定義綁定器需要實(shí)現(xiàn) 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
更多建議: