beego框架之路由實踐


  近日在學習beego框架,今天把beego框架中的路由設置這一塊進行了動手實踐,感覺beego框架的路由功能還是蠻強大的。參考原文:http://beego.me/docs/mvc/controller/router.md#namespace

  修改過程中主要是修改了routers/router.go文件,當然也有修改controllers/default.go,views/index.tpl和自己追加了一個login.html頁面。這里主要是動手實踐路由配置,所以僅僅保持路由的代碼。

routers/router.go

  1 package routers
  2 
  3 import (
  4     "beegorouter/controllers"
  5     "github.com/astaxie/beego"
  6     "github.com/astaxie/beego/context"
  7 )
  8 
  9 func init() {
 10     // bee 工具自動生成的固定路由
 11     beego.Router("/", &controllers.MainController{})
 12 
 13     // beego路由實踐,參考文檔:http://beego.me/docs/mvc/controller/router.md
 14 
 15     /**
 16      * 基礎路由實踐
 17      */
 18 
 19     /**
 20      * 基本Get路由實踐
 21      * 注意事項:需要導入包:github.com/astaxie/beego/context
 22      *           否則【context.Context】會編譯出錯
 23      * 測試用例:瀏覽器里輸入:http://localhost:8080/get
 24      * 輸出結果:在瀏覽器頁面里顯示:基本Get路由實踐。
 25      */
 26     beego.Get("/get", func(ctx *context.Context) {
 27         ctx.Output.Body([]byte("基本Get路由實踐。"))
 28     })
 29 
 30     /**
 31      * 基本Post路由實踐
 32      * 注意事項:需要修改或是追加html頁面,從頁面提交一個post請求
 33      * 測試用例:修改index.tpl模板,追加一按鈕,指定method="post",點擊該按鈕
 34      * 輸出結果:基本Post路由實踐。
 35      */
 36     beego.Post("/post", func(ctx *context.Context) {
 37         ctx.Output.Body([]byte("基本Post路由實踐。"))
 38     })
 39 
 40     /**
 41      * 正則路由實踐
 42      */
 43 
 44     /**
 45     * 正則路由實踐
 46     * 注意事項:1. 第二個參數需要傳遞一個控制器:Controller
 47     *           2. 【?:id】 中的id也可以換成其他字符,如:【?:abc】
 48     * 測試用例:能 匹 配:/api ; /api/123 ; /api/abc ; /api/abc.html ; /api/abc/
 49                 不能匹配:/api/123/456 :即/api/之后只能再接一個參數
 50     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 51     */
 52     beego.Router("/api/?:id", &controllers.MainController{})
 53 
 54     /**
 55     * 正則路由實踐
 56     * 注意事項:【:id】前面沒有了 ?
 57     * 測試用例:能 匹 配:/api/123 ; /api/abc ; /api/abc.html ; /api/abc/
 58                 不能匹配:/api ; /api/123/456 :即/api/之后只能再接一個參數
 59     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 60     */
 61     beego.Router("/api/:id", &controllers.MainController{})
 62 
 63     /**
 64     * 正則路由實踐
 65     * 注意事項:【:id】前面沒有了 ?
 66     * 測試用例:能 匹 配:/api/123 ; /api/0
 67                 不能匹配:/api ; /api/123/456 ; /api/abc ; /api/123.html
 68     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 69     */
 70     beego.Router("/api/:id:int", &controllers.MainController{})
 71 
 72     /**
 73     * 正則路由實踐
 74     * 注意事項::id([0-9]+) 之中有個 + 號。有+號時表示可以是多位數字,無+號表示就只能匹配一位數字
 75     * 測試用例:能 匹 配:/api/123 ; /api/0
 76                 不能匹配:/api ; /api/abc ; /api/123/456 :即/api/之后只能再接一個參數
 77     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 78     */
 79     beego.Router("/api/:id([0-9]+)", &controllers.MainController{})
 80 
 81     /**
 82     * 正則路由實踐
 83     * 注意事項::[\\w] 之中的w不能替換為別的字符
 84     * 測試用例:能 匹 配:/api/123 ; /api/hezhixiong
 85                 不能匹配:/api ; /api/abc.html
 86     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 87     */
 88     beego.Router("/api/:username([\\w]+)", &controllers.MainController{})
 89 
 90     /**
 91     * 正則路由實踐
 92     * 注意事項:: :username:string表示 username為string型
 93     * 測試用例:能 匹 配:/api/123 ; /api/hezhixiong
 94                 不能匹配:/api ; /api/abc.html
 95     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
 96     */
 97     beego.Router("/api/:username:string", &controllers.MainController{})
 98 
 99     /**
100     * 正則路由實踐
101     * 注意事項::無
102     * 測試用例:能 匹 配:/api/123 ; /api/hezhixiong ; /api/abc.html ; /api/abc/123/efg/ddd
103                 不能匹配:/api
104     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
105     */
106     beego.Router("/api/*.*", &controllers.MainController{})
107 
108     /**
109     * 正則路由實踐
110     * 注意事項::無
111     * 測試用例:能 匹 配:/api/123 ; /api/hezhixiong ; /api/abc.html ; /api/abc/123/efg/ddd
112                 不能匹配:/api
113     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
114     */
115     beego.Router("/api/*", &controllers.MainController{})
116 
117     /**
118     * 正則路由實踐
119     * 注意事項::無
120     * 測試用例:能 匹 配:/api/bei_123.html ; /api/bei_0.html
121                 不能匹配:/api/bei_.html ; /api/bei_123 ; /api/bei_12a.html
122     * 輸出結果:具體輸出結果需要看第二個參數的Get()方法所指定的模板和數據。
123     */
124     beego.Router("/api/bei_:id([0-9]+).html", &controllers.MainController{})
125 
126     /**
127      * 自定義方法及RESTful規則的實踐
128      */
129 
130     /**
131     * 自定義方法實踐
132     * 注意事項:第三個參數"*:MyMethod"之中,不能有空格(如:"* : MyMethod"),否則編譯報錯
133     * 測試用例:客戶端進行Get,Post,Put,Delete請求
134     * 輸出結果:執行 MainController的MyMethod方法,不再執行RESTful的規則:即Get請求執行Get方法……
135      */
136     beego.Router("/bei", &controllers.MainController{}, "*:MyMethod")
137     /**
138     * Get請求不再執行Get()函數,而是執行指定的MyGet()函數,沒指定的其他請求(如Post),則按照RESTful規則執行
139     * beego.Router("/bei", &controllers.MainController{}, "get:MyGet")
140     *
141     * 多個 HTTP Method 指向同一個函數
142     * beego.Router("/bei", &controllers.MainController{}, "get,post:MyGetPost")
143     *
144     * 不同的 method 對應不同的函數,通過 ;進行分割
145     * beego.Router("/bei", &controllers.MainController{}, "get:GetFunc;post:PostFunc")
146      *
147     * 如果同時存在 * 和對應的 HTTP Method,那么優先執行 HTTP Method 的方法
148     * beego.Router("/bei", &controllers.MainController{}, "*:AllFunc;post:PostFunc")
149     */
150 
151     /**
152      * 自動路由
153      */
154 
155     /**
156     * 正則路由實踐
157     * 注意事項:控制器的名稱為:MainController,那么【main】為路徑中的第一個參數
158     * 測試用例:路徑為:/main/login      將會調用 MainController 中的Login()函數
159                 路徑為:/main/login/123  將會調用 MainController 中的Login()函數
160                 路徑為:/hello/login.htm 將會調用 MainController 中的Login()函數
161                 路徑為:/hello/login     不能調用 MainController 中的Login()函數
162                 路徑為:/hellologin      不能調用 MainController 中的Login()函數
163     * 輸出結果:具體輸出結果需要看控制器(MainController)的Login函數所指定的模板和數據。
164     */
165     beego.AutoRouter(&controllers.MainController{}) // 把需要的路由注冊到自動路由中
166 
167     /**
168      * 注解路由
169      */
170 
171     /**
172     * 注解路由實踐
173     * 注意事項:重要comments:// @router
174     * 測試用例:
175     * 輸出結果:具體輸出結果需要看控制器(MainController)的函數所指定的模板和數據。
176      */
177     beego.Include(&controllers.MainController{})
178 
179     /**
180      * namespace路由
181      */
182 
183     /**
184     * namespace路由實踐
185     * 注意事項:必須要把NewNamespace的對象注冊到AddNamespace中去,否則無效
186     * 測試用例:僅僅匹配:/aaa/go
187     * 輸出結果:get請求的情況下,執行指定函數Login;其他HTTP method則按照RESTful規則
188      */
189     ns_1 := beego.NewNamespace("aaa", beego.NSRouter("/go", &controllers.MainController{}, "get:Login"))
190     // beego.AddNamespace(ns_1)
191 
192     /**
193      * 域名如果不是:127.0.0.1,則不可以匹配 /bbb/go
194      * 僅僅匹配:/bbb/go
195      */
196     ns_2 := beego.NewNamespace("bbb",
197         beego.NSCond(func(ctx *context.Context) bool {
198             if ctx.Input.Domain() == "127.0.0.1" {
199                 return true
200             }
201             return false
202         }),
203         beego.NSRouter("/go", &controllers.MainController{}, "get:Login"),
204     )
205 
206     ns_3 := beego.NewNamespace("ccc",
207         beego.NSRouter("/go", &controllers.MainController{}, "get:Login"),
208         // 條件判斷,如果為真,則可以匹配上下文的路由,如果為假,則上下文的路由都不能匹配
209         beego.NSCond(func(ctx *context.Context) bool {
210             if ctx.Input.Domain() == "127.0.0.1" {
211                 return true
212             }
213             return false
214         }),
215         beego.NSRouter("php", &controllers.MainController{}),
216         beego.NSGet("java", func(ctx *context.Context) {
217             ctx.Output.Body([]byte("顯示Get追加的內容"))
218         }),
219 
220         // nasespace嵌套示例
221         beego.NSNamespace("room",
222             beego.NSCond(func(ctx *context.Context) bool {
223                 // 如果子namespace的判斷條件為假,那么僅僅是子namespace的url不能匹配,不影響夫namespace的匹配結果
224                 if ctx.Input.Request.Method != "GET" {
225                     return true
226                 }
227                 return false
228             }),
229             beego.NSRouter("/shanghai", &controllers.MainController{}), // 匹配地址:/ccc/room/shanghai
230         ),
231     )
232 
233     beego.AddNamespace(ns_1, ns_2, ns_3)
234 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM