1. 程式人生 > >beego——獲取引數

beego——獲取引數

1.獲取引數

我們經常需要獲取使用者傳遞的資料,包括Get、POST等方式的請求,beego裡面會自動解析這些資料,你可以通過如下方式獲取資料:

  • GetString(key string) string
  • GetStrings(key string) []string
  • GetInt(key string) (int64, error)
  • GetBool(key string) (bool, error)
  • GetFloat(key string) (float64, error)

示例1:

func (this *MainController) Post() {
    jsoninfo := this.GetString
("jsoninfo") if jsoninfo == "" { this.Ctx.WriteString("jsoninfo is empty") return } }

如果你需要的資料可能是其它型別,例如是int型別而不是int64,那麼你需要這樣處理:

示例2:

func (this *MainController) Post() {
    id := this.Input().Get("id")
    intid, err := strconv.Atoi(id)
}

更多其他的request的資訊,使用者可以通過this.Ctx.Request獲取資訊。

關於該物件的屬性和方法可參考request官方手冊https://gowalker.org/net/http#Request

 

 

2.直接解析到struct

如果要把表單裡的內容賦值到一個struct裡,除了用上面的方法一個一個獲取再賦值之外,

beego提供了通過另外一個更便捷的方式,就是通過struct的欄位名或tag與表單欄位對應直接解析到struct。

示例3:

定義struct

type user struct {
    Id    int         `form:"-"`
    Name  interface{} `form:"username
"` Age int `form:"age"` Email string }

表單

<form id="user">
    名字:<input name="username" type="text" />
    年齡:<input name="age" type="text" />
    郵箱:<input name="Email" type="text" />
    <input type="submit" value="提交" />
</form>

controller裡解析

func (this *MainController) Post() {
    u := user{}
    if err := this.ParseForm(&u); err != nil {
        //handle error
    }
}  

需要說明的是:

  (1)structTag form的定義和renderform方法共用一個標籤。

  (2)定義struct時,欄位名後如果有form這個tag,則會把form表單裡的name和tag的名字一樣的欄位賦值給這個欄位,

    否則就會把form表單裡與欄位名一樣的表單內容賦值給這個欄位。

    例如上面的例子中,會把表單中的username和age分別賦值給user裡的Name和Age欄位,而Email裡的內容則會賦值給Email這個欄位。

  (3)呼叫Controller PraseForm這個方法的時候,傳入的引數必須為一個struct的指標,否則對struct的賦值不會成功並返回xx must be a struct pointer的錯誤。

  (4)如果要忽略一個欄位,有兩種方法,一是:欄位名小寫開頭,二是:form標籤設定為_

 

3.獲取Request Body裡的內容

在API的開發中,我們經常會用到JSON或XML來作為資料互動的格式,如何在beego中獲取Request Body裡的JSON或XML的資料呢?

首先,在配置檔案裡設定copyrequestbody = true

其次,在Controller中:

示例4:

func (this *ObjectController) Post() {
    var ob models.Object
    var err error
    if err = json.Unmarshal(this.Ctx.Input.RequestBody, &ob); err == nil {
        objectid := models.AddOne(ob)
        this.Data["json"] = "{\"ObjectId\":\"" + objectid + "\"}"
    } else {
        this.Data["json"] = err.Error()
    }
    this.ServeJSON()
}

  

4.檔案上傳

在beego中你可以很容易的處理檔案上傳,就是別忘記在你的form表單中增加“enctype="multipart/form-data”,否則你的瀏覽器不會傳輸你的上傳檔案。

檔案上傳之後一般是放在系統的記憶體裡面,如果檔案的size大於設定的快取大小,那麼就放在臨時檔案中,

預設的快取記憶體是64M,你可以通過如下方式來調整這個快取記憶體的大小。

beego.MaxMemory = 1<<22

或者在配置檔案中通過如下設定:

maxmemory = 1<<22

Beego提供了兩個很方便的方法來處理檔案上傳:

(1)GetFile(key string) (multipart.File, *multipart.FileHeader, error)

  該方法主要用於使用者讀取表單中的檔名the_file,然後返回相應的資訊,使用者根據這些變數來處理檔案上傳:過濾、儲存檔案等。

(2)SaveToFile(fromfile, tofile string) error

  該方法是在GetFile的基礎上實現了快速儲存的功能,fromfile是提交的時候html表單中的name。

示例5

表單:

<form enctype="multipart/form-data" method="post">
    <input type="file" name="uploadname" />
    <input type="submit">
</form>

Controller中程式碼:

func (c *FormController) Post() {
    f, h, err := c.GetFile("uploadname")
    if err != nil {
        log.Fatal("getfile err ", err)
    }
    defer f.Close()
    c.SaveToFile("uploadname", "static/upload/" + h.Filename) // 儲存位置在 static/upload, 沒有資料夾要先建立
    
}

  

 

5.資料繫結

支援從使用者請求中直接資料bind到指定的物件。

示例6:

?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&user.Name=astaxie

  

var id int
this.Ctx.Input.Bind(&id, "id")  //id ==123

var isok bool
this.Ctx.Input.Bind(&isok, "isok")  //isok ==true

var ft float64
this.Ctx.Input.Bind(&ft, "ft")  //ft ==1.2

ol := make([]int, 0, 2)
this.Ctx.Input.Bind(&ol, "ol")  //ol ==[1 2]

ul := make([]string, 0, 2)
this.Ctx.Input.Bind(&ul, "ul")  //ul ==[str array]

user struct{Name}
this.Ctx.Input.Bind(&user, "user")  //user =={Name:"astaxie"}