1. 程式人生 > 其它 >(六)Beego控制器之獲取請求引數

(六)Beego控制器之獲取請求引數

web.Controller基礎控制器,為我們提供了多種讀取請求引數的函式,下面分別介紹各種獲取引數的場景。

一、預設獲取引數方式

web.Controller基礎控制器為我們提供了GetXXX序列獲取引數的函式, XXX指的就是返回不同的資料型別。
例子:

// 處理get請求
func (this *UserController) Get() {
	// 獲取引數, 返回int型別
	id ,_:= this.GetInt("id")
	
	// 獲取引數,返回string型別, 如果引數不存在返回none作為預設值
	username := this.GetString("username", "none")
	
	// 獲取引數,返回float型別, 引數不存在則返回 0
	price, _ := this.GetFloat("price", 0)
}

下面是常用的獲取引數的函式定義:

  • GetString(key string, def ...string) string
  • GetInt(key string, def ...int) (int, error)
  • GetInt64(key string, def ...int64) (int64, error)
  • GetFloat(key string, def ...float64) (float64, error)
  • GetBool(key string, def ...bool) (bool, error)

預設情況使用者請求的引數都是 字串 型別,如果要轉換成其他型別,就可能會出現型別轉換失敗的可能性,因此除了GetString函式,其他GetXXX函式,都返回兩個值,第一個值是需要獲取的引數值,第二個就是error,表示是資料型別轉換是否失敗。

二、繫結struct方式

除了上面一個一個的獲取請求引數,針對POST請求的表單資料,beego支援直接將表單資料繫結到一個struct變數。
例子:

// 定義一個struct用來儲存表單資料
// 通過給欄位設定tag, 指定表單欄位名, - 表示忽略這個欄位不進行賦值
// 預設情況下表單欄位名跟struct欄位名同名(小寫)
type UserForm struct {
    // 忽略掉Id欄位
    Id    int         `form:"-"`
    // 表單欄位名為username
    Name  string      `form:"username"`
    Phone string
}
說明: 如果表單欄位跟struct欄位(小寫)同名,不需要設定form標籤。 表單html程式碼:
<form action="/user" method="POST">
    手機號:<input name="phone" type="text" /><br/>
    使用者名稱:<input name="username" type="text" />
    <input type="submit" value="提交" />
</form>

控制器函式:

func (this *UserController) Post() {
    // 定義儲存表單資料的struct物件
    u := UserForm{}
    // 通過ParseForm函式,將請求引數繫結到struct變數。
    if err := this.ParseForm(&u); err != nil {
        // 繫結引數失敗
    }
}
提示:使用struct繫結請求引數的方式,僅適用於POST請求。

三、處理json請求引數

一般在介面開發的時候,有時候會將json請求引數儲存在http請求的body裡面。我們就不能使用前的方式獲取json資料,需要直接讀取請求body的內容,然後格式化資料。
處理json引數的步驟:

  1. 在app.conf配置檔案中,新增CopyRequestBody=true
  2. 通過this.Ctx.Input.RequestBody獲取請求body的內容
  3. 通過json.Unmarshal反序列化json字串,將json引數繫結到struct變數。

例子:
定義struct用於儲存json資料

// 如果json欄位跟struct欄位名不一樣,可以通過json標籤設定json欄位名
type UserForm struct {
    // 忽略掉Id欄位
    Id    int         `json:"-"`
    // json欄位名為username
    Name  string      `json:"username"`
    Phone string      
}

控制器程式碼:

func (this *UserController) Post() {
    // 定義儲存json資料的struct物件
    u := UserForm{}
    
    // 獲取body內容
    body := this.Ctx.Input.RequestBody
    
    // 反序列json資料,結果儲存至u
    if err := json.Unmarshal(body, &u); err == nil {
        // 解析引數失敗
    }
}
提示: 如果將請求引數是xml格式,xml引數也是儲存在body中,處理方式類似,就是最後一步使用xml反序列化函式進行處理。