Go Web開發之Revel - 參數綁定


Revel嘗試盡可能簡單的轉換參數到Go的類型.這個轉換從string到另一種類型被稱為數據綁定.

參數

全部的請求參數被收集到一個Params對象中.它包括如下:

  • URL 路徑參數
  • URL 查詢參數
  • 表單值 (Multipart or not)
  • 上傳文件

定義如下(godoc)

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

這個嵌入的 url.Values (godoc)提供了訪問簡單值的方式,但是開發人員將使用更容易的Revel數據綁定機制來查找非字符串值.

Action參數

參數可以直接作為方法的參數被接收,如下:

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

在調用action前,Revel要求它的綁定器來對這些名字的參數進行類型轉換,如果由於任何原因造成綁定失敗,參數將有一個默認值.

綁定器

綁定參數到數據類型,使用Revel的綁定器(godoc),它整合參數對象如下:

func (c SomeController) Action() rev.Result {
    var ids []int = c.Params.Bind("ids[]", reflect.TypeOf([]int{}))
    ...
}

下面的數據類型是被支持的:

  • Ints of all widths
  • Bools
  • Pointers to any supported type
  • Slices of any supported type
  • Structs
  • time.Time for dates and times
  • *os.File, []byte, io.Reader, io.ReadSeeker for file uploads

下面的部分將描述這些類型的語法,你也可以參考源代碼

Booleans

字符串的值"true","on"和"1"都被視為true, 其他的綁定值為false.

Slices

綁定Slices有兩個被支持的語法:排序和未排序.

排序:

?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}

注意:綁定一個slice結構時,只有排序的slice應該被使用.

?user[0].Id=1
&user[0].Name=rob
&user[1].Id=2
&user[1].Name=jenny

Structs

結構使用簡單的點符號綁定:

?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
}

注意:為了綁定,屬性必須被導出.

Date / Time

內建的SQL標准時間格式是 “2006-01-02”, “2006-01-02 15:04”

應用程序可以添加更多的,使用官方的模式.簡單的添加模式來識別TimeFormats變量,如下:

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

文件上傳

文件上傳可以被綁定到下面的類型:

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

這是一個有Go multipart包提供的包裝器,bytes存放在內存中除非他們超過了一個閥值(默認10MB), 在這種情況下它們被寫入臨時文件.

注意:綁定一個文件上傳到 os.File 需要Revel把它寫入到一個臨時文件, 它的效率要低於其他的類型.

自定義綁定器

應用程序可以定義它自己的綁定器來利用這個框架.

它只需要實現綁定器接口和注冊這個類型它將在哪里被調用:

func myBinder(params Params, name string, typ reflect.Type) reflect.Value {
    ...
}

func init() {
    rev.TypeBinders[reflect.TypeOf(MyType{})] = myBinder
}

 

至此結束.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM