近日在學習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 }