路由使用原始的Play!語法定義,定義被保存在routes文件中.
基礎語法:
(METHOD) (URL Pattern) (Controller.Action)
下面這個例子展示了所有的使用方法
# conf/routes # This file defines all application routes (Higher priority routes first) GET /login Application.Login <b># 一個簡單的路徑</b> GET /hotels/? Hotels.Index <b># 匹配 /hotels 和 /hotels/ (可選的尾斜線)</b> GET /hotels/{id} Hotels.Show <b># 提取一個URI參數 (匹配 /[^/]+/)</b> POST /hotels/{<[0-9]+>id} Hotels.Save <b># 自定義正則URI </b> WS /hotels/{id}/feed Hotels.Feed <b># WebSockets.</b> POST /hotels/{id}/{action} Hotels.{action} <b># 自動路由一些actions.</b> GET /public/ staticDir:public <b># 映射 /app/public 資源在 /public/ 目錄下</b> * /{controller}/{action} {controller}.{action} <b># 捕獲全部;自動URL生成 </b>
一個簡單的路徑
GET /login Application.Login
最簡單的路由使用一個完全匹配方法和路徑.它將調用Application Controller的Login方法.
可選尾斜線
GET /hotels/? Hotels.Index
問號被視為一個正則表達式:他們允許路徑匹配使用或不使用前面的字符,當路徑是/hotels或/hotels時,這個路由調用Hotels.Index方法
URL參數
GET /hotels/{id} Hotels.Show
路徑的片段可以被匹配和提取.默認情況下,{id}將匹配除了/外的任意字符.在這個案例中,/hotels/123和/hotels/abc都將被路由匹配.
可以在Controller.Params(map類型)中提取參數,也可以通過action方法參數來提取,如下所示:
func (c Hotels) Show(id int) rev.Result { ... }
或
func (c Hotels) Show() rev.Result { var id string = c.Params.Get("id") ... }
或
func (c Hotels) Show() rev.Result { var id int = c.Params.Bind("id", reflect.TypeOf(0)) ... }
自定義正則表達式的URL參數
POST /hotels/{<[0-9]+>id} Hotels.Save
路由也可以定義為正則表達式並用他們的參數來限定他們將匹配什么,在這個例子中我們限定了Hotel ID為數字。
WebSockets
WS /hotels/{id}/feed Hotels.Feed
Websockets也是已相同的方式路由,只是使用一個WS的標示符,對應下面的匹配方法
func (c Hotels) Feed(ws *websocket.Conn, id int) rev.Result { ... }
Static服務
GET /public/ staticDir:public
為了服務靜態資源文件,Revel提供了StaticDir指令。這個路由告訴Revel使用http.ServeFile來處理前綴是/public/的路徑的請求,相應的靜態文件對應在public目錄,參考組織結構.
自動路由
POST /hotels/{id}/{action} Hotels.{action} * /{controller}/{action} {controller}.{action}
Url參數提取也能被應用於決定哪個action將被調用.匹配controller和action是大小寫不敏感的.
第一條的路由將影響下面的路由
/hotels/1/show => Hotels.Show /hotels/2/details => Hotels.Details
相似的,第二條路由可以用於匹配任意的action
/application/login => Application.Login /users/list => Users.List
因為匹配controller和action是大小寫不敏感的,下面的路由也將正常工作
/APPLICATION/LOGIN => Application.Login
/Users/List => Users.List
使用自動路由作為捕獲所有的請求,對於沒有定義的路由很有幫助.
至此結束.