代码改变世界

Go Web开发之Revel - 路由

2013-01-03 14:33  Danny.tian  阅读(4295)  评论(4编辑  收藏  举报

路由使用原始的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

使用自动路由作为捕获所有的请求,对于没有定义的路由很有帮助.

 

至此结束.