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