conf/routes 是 Revel 唯一路由配置文件,采用纯文本三段式语法(METHOD URL_PATTERN CONTROLLER.ACTION),路径参数用 {id},查询参数不写入路由,匹配顺序从上到下,WebSocket 路由以 WS 开头。

conf/routes 文件是唯一路由配置入口
Revel 的路由规则只写在 conf/routes 文件里,没有其他地方可配。它不是 Go 代码,而是纯文本声明式语法,由 Revel 启动时解析并构建内部路由表。改完必须重启(开发模式下热重载会自动触发重载,但语法错误会导致启动失败)。
常见错误现象:404 Not Found 却确认路径拼写无误——大概率是 routes 文件格式错,比如漏空格、多空格、用了中文标点,或把 GET 写成 get(大小写敏感)。
- 每行必须严格按
METHOD URL_PATTERN CONTROLLER.ACTION三段式,用空格分隔(不能用 Tab) - 注释以
#开头,且#前必须有空格或换行,否则整行被当路由解析 - URL_PATTERN 中不能出现
?或=,例如GET /company?name=:name是非法的,直接导致该行路由失效 - 通配符
*只能出现在路径末尾,如GET /public/*filepath,中间或开头都不行
路径参数用 {id} 或 :id,别混用
Revel 支持两种路径参数写法:{id}(Play! 风格)和 :id(Rails 风格),但二者不能在同一项目中混用——conf/routes 解析器只认一种。默认启用的是 {id},除非你显式修改了 conf/app.conf 中的 router.format 配置(不推荐改)。
使用场景:需要从 URL 路径提取值,比如 /users/123 中的 123。
-
GET /users/{id} Users.Show→ 在控制器中可通过c.Params.Get("id")或func(c Users) Show(id int)获取 - 若需限制匹配规则,用正则:
GET /users/{id} Users.Show,这样/users/abc就不会匹配 -
:id写法仅在旧版兼容模式下有效,新项目一律用{id} - 路径参数名必须和
c.Params.Get("xxx")中的字符串完全一致,区分大小写
查询参数不用写进路由,c.Params.Get() 自动合并
URL 查询参数(query string)根本不需要、也不应该出现在 conf/routes 里。比如 GET /company?name=ABC&category=tech,你只需定义 GET /company Company.Show,其余全由框架自动处理。
为什么这样做?因为 Revel 把所有输入源(query、form、path、multipart)统一归入 c.Params,避免路由膨胀和重复声明。
-
c.Params.Get("name")返回第一个匹配值(?name=A&name=B时得A) - 要取全部值,用
c.Params.Values["name"],它返回[]string - 如果参数名含特殊字符(如
user[email]),c.Params.Get("user[email]")仍可正常工作,无需转义 - 错误示例:
GET /company?name=:name Company.Show—— 这行会被忽略,且可能破坏后续路由解析
尾斜线 /? 和静态资源路由要注意优先级
Revel 路由匹配是「从上到下」顺序执行,一旦匹配就停止,所以高优先级路由(如精确路径)必须放在前面。尾斜线和静态资源是两个典型易错点。
性能影响:尾斜线匹配会额外做一次正则判断;静态资源若没配对,所有请求都打到 Go 应用,白白增加 HTTP 层开销。
-
GET /hotels/? Hotels.Index表示同时匹配/hotels和/hotels/,问号是正则语法,不是字面量 - 静态资源建议用
GET /public/*filepath Static.Serve("public"),而不是靠 Go 控制器转发,前者由 Revel 底层优化,响应更快 - 若同时存在
GET /public/*filepath和GET /public/ CSS.Show,后者永远不会触发——因为/*通配更宽泛,排前面就先匹配了 - WebSocket 路由用
WS开头,如WS /chat/{room} Chat.Join,它和 HTTP 路由分开管理,互不影响
?key=value 写法,白耗半天。记住——query 不进 routes,只进 c.Params。



















