Go Revel - Parameters(參數綁定)
##參數綁定
Revel框架會盡可能的將提交參數轉換為期望的Go類型。這個從一個字符串提交參數轉換為另一個類型被稱為`數據綁定` 。
##參數
所有的請求參數被存放在一個`Params`中,他包括:
URL路徑參數
URL查詢參數
表單值(或Multipart)
文件上傳
這是`Params`的定義:
type Params struct {
url.Values
Files map[string][]*multipart.FileHeader
}
嵌入的`url.Values`提供了對簡單值的訪問,但開發者會發現非字符的值使用revel的數據綁定機制也非常容易。
## Action參數
`Params`中的參數可以當作方法參數被Action接收。例如:
func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result {
...
}
在調用之前,revel會使用`Binder`綁定器將提交的參數按名稱轉換為期望類型,如果轉換不成功,將會用期望類型的0值代替。
##Binder綁定器
綁定一個提交參數至期望的類型。
func (c SomeController) Action() revel.Result {
var ids []int
c.Params.Bind(&ids, "ids")
...
}
以下的數據類型支持開箱轉換:
任意寬度的int整數
Bool類型
任意支持類型的指針
任意支持類型的切片
結構
time.Time 類型的日期與時間
*os.File, []byte, io.Reader, io.ReadSeeker 文件上傳用到的
##Booleans
字符串值`true`, `on`, 與 `1` 都會被轉為`true`,否則被轉為`false`
##Slices
對于slices切片有兩種支持: ordered 有序 與 unordered 無序.
有序:
?ids[0]=1
&ids[1]=2
&ids[3]=4
slice中的數據 []int{1, 2, 0, 4}
無序:
?ids[]=1
&ids[]=2
&ids[]=3
slice中的數據 []int{1, 2, 3}
只有struct切片將會使用有序切片
?user[0].Id=1
&user[0].Name=rob
&user[1].Id=2
&user[1].Name=jenny
##Structs
struct使用`.`符號來進行綁定
?user.Id=1
&user.Name=rob
&user.Friends[]=2
&user.Friends[]=3
&user.Father.Id=5
&user.Father.Name=Hermes
將會綁定為:
type User struct {
Id int
Name string
Friends []int
Father User
}
只有可導出字段才能被綁定。
##日期與時間
revel內置了SQL標準時間字符串格式`[“2006-01-02”, “2006-01-02 15:04”]`
可以用如下方法添加其他的時間格式:
func init() {
revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}
##文件上傳
上傳的文件可以被綁定為以下任意一種類型:
*os.File
[]byte
io.Reader
io.ReadSeeker
上傳使用Go的`multipart`來處理。上傳的數據首先被保存在內存中,當大小超過10MB(默認)時,會保存至臨時文件。
當綁定為`os.File`類型時,revel會默認將上傳的文件存儲至臨時文件,這樣相比其他類型,效率比較低。
##自定義 Binders
創建自定義Binder綁定器,只需要實現`binder`接口并且注冊。
func myBinder(params Params, name string, typ reflect.Type) reflect.Value {
...
}
func init() {
revel.TypeBinders[reflect.TypeOf(MyType{})] = myBinder
}
浙公網安備 33010602011771號