(五)Beego控制器之控制器函式
阿新 • • 發佈:2022-05-08
控制器函式指的是處理使用者請求的函式,前面路由設定章節介紹過,beego框架支援兩種處理使用者請求的函式。
- beego.FilterFunc型別的獨立函式
- 控制器函式(RESTful風格實現,beego預設推薦的格式)
一、beego.FilterFunc函式
這是最簡單的請求處理函式,函式原型定義:
type FilterFunc func(*context.Context)
也就是隻要定義一個函式,並且接收一個Context引數,那麼這個函式就可以作為處理使用者請求的函式。
例子:
func DoLogin(ctx *context.Context) { // ..處理請求的邏輯... // 可以通過Context 獲取請求引數,返回請求結果 }
有了處理函式,我們就可以將處理函式跟一個url路由繫結起來.
例子:
web.Get("/user/login", DoLogin)
提示: 新版的beego設計,預設不推薦使用beego.FilterFunc函式方式,這種方式處理請求的方式比較原始,後面介紹的控制器函式擁有更多高階特性,後續的教程以控制器函式為主。
二、控制器函式
控制器函式是beego的RESTful api的實現方式,在beego的設計中,控制器就是一個嵌套了beego.Controller的結構體物件。
例子:
// 定義一個新的控制器 type UserController struct { // 巢狀beego基礎控制器 web.Controller }
前面介紹過,struct巢狀,就類似其他高階語言的 繼承 特性,嵌套了web.Controller控制器,就擁有了web.Controller定義的屬性和函式。
控制器命名規則約定:XxxController
Xxx就是我們的控制器名字, 這是為了便於閱讀,看到Controller結尾的struct就知道是一個控制器。
下面看一個完整控制器的例子:
type UserController struct { // 巢狀beego基礎控制器 web.Controller } // 在呼叫其他控制器函式之前,會優先呼叫Prepare函式 func (this *UserController) Prepare() { // 這裡可以跑一些初始化工作 } // 處理get請求 func (this *UserController) Get() { // 處理邏輯 } // 處理post請求 func (this *UserController) Post() { // 處理邏輯 }
註冊路由
// 在這裡引數:id是可選的
web.Router("/user/?:id", &controllers.UserController{})
根據上面註冊的路由規則, 下面的展示對應的http請求和處理函式:
- GET /user/2 - 由Get函式處理
- POST /user - 由Post函式處理
提示:前面路由設定章節介紹過控制器的路由規則是Get請求由Get函式處理,Post請求由Post函式處理,以此類推。
下表展示了web.Controller預設為我們提供了哪些可選的函式:
提示: 根據業務需要,控制器可以覆蓋下表中的函式。
函式名 | 說明 |
---|---|
Prepare() | 這個函式會優先執行,才會執行Get、Post之類的函式, 可以在Prepare做一些初始化工作。 |
Get() | 處理get請求, 如果沒有實現該函式,預設會返回405錯誤。 |
Post() | 處理Post請求, 預設會返回405錯誤。 |
Delete() | 處理Delete請求, 預設會返回405錯誤。 |
Put() | 處理PUT請求, 預設會返回405錯誤。 |
Finish() | 執行完Get、Post之類http請求函式之後執行,我們可以在Finish函式處理一些回收工作。 |
三、如何提前結束請求
如果我們在Prepare函式處理使用者的許可權驗證,驗證不通過,我們一般都希望結束請求,不要執行後面的函式,beego提供了StopRun函式來結束請求。
例子:
func (this *UserController) Prepare() {
// 處理許可權驗證邏輯
// 驗證不通過,返回錯誤資訊,結束請求
this.Data["json"] = map[string]interface{}{"error":"沒有許可權", "errno":401}
this.ServeJSON()
this.StopRun()
}
提示:呼叫 StopRun 之後,不會再執行Finish函式,如果有需要可以在呼叫StopRun之後,手動呼叫Finish函式。