請求資料處理

尹成發表於2018-11-14

#獲取引數
我們經常需要獲取使用者傳遞的資料,包括 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)

使用例子如下:

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

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

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

更多其他的 request 的資訊,使用者可以通過 this.Ctx.Request 獲取資訊,關於該物件的屬性和方法參考手冊 Request。

#直接解析到 struct
如果要把表單裡的內容賦值到一個 struct 裡,除了用上面的方法一個一個獲取再賦值外,beego 提供了通過另外一個更便捷的方式,就是通過 struct 的欄位名或 tag 與表單欄位對應直接解析到 struct。

定義 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 ParseForm 這個方法的時候,傳入的引數必須為一個 struct 的指標,否則對 struct 的賦值不會成功並返回 xx must be a struct pointer 的錯誤。
4.如果要忽略一個欄位,有兩種辦法,一是:欄位名小寫開頭,二是:form 標籤的值設定為 -

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

檔案上傳之後一般是放在系統的記憶體裡面,如果檔案的 size 大於設定的快取記憶體大小,那麼就放在臨時檔案中,預設的快取記憶體是 64M,你可以通過如下來調整這個快取記憶體大小:

beego.MaxMemory = 1<<22

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

maxmemory = 1<<22

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

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

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

SaveToFile(fromfile, tofile string) error

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

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

儲存的程式碼例子如下:

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, 沒有資料夾要先建立
    
}

#資料繫結
支援從使用者請求中直接資料 bind 到指定的物件,例如請求地址如下

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

學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928

清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
在這裡插入圖片描述

相關文章