Revel路由仅匹配路径,不支持动态查询参数声明,参数由框架自动注入c.Params;路由格式必须严格为METHOD PATH CONTROLLER.ACTION,路径参数用:name,通配符**filepath须在末尾且前有斜线,WebSocket路由需显式声明*websocket.Conn参数。

Revel 的 routes 文件不支持动态查询参数声明,也不需要你手动解析 URL 结构——它只负责路径匹配和控制器分发,其余参数(query、form、path)全由框架自动注入 c.Params。写错格式或强行在路由里塞 ?key=value 会导致 404 或静默匹配失败。
路由语法必须严格按 METHOD + PATH + CONTROLLER.ACTION 格式
每一行只能有一个空格分隔三部分,不能有多余空格、注释位置错误或拼写偏差。比如:
-
GET /company App.ShowByName✅ 正确 -
GET /company?name:string App.ShowByName❌ 无效,?name:string不是合法路径成分,会被当字面量匹配 -
GET /company App.ShowByName❌ 行尾空格可能导致解析失败(某些版本会跳过整行) -
# GET /test App.Test✅ 注释必须以#开头且独占一行
路径参数用 :name,不是 {name} 或 $name
Revel 只识别冒号前缀的命名参数,且仅匹配「不含斜线」的片段。例如:
-
GET /hotels/:id Hotels.Show→ 匹配/hotels/123和/hotels/abc,但不匹配/hotels/123/detail -
GET /api/v1/:version/:id User.Get→:version只能是单段,如v1,不能是v1.2(含点)或v1/extra(含斜线) - 参数值最终存进
c.Params.Get("id"),类型是string;若需转int,得自己调strconv.Atoi或用c.Params.Bind(&id, "id")
通配符 *filepath 必须放在路径末尾,且前面要有斜线
这是唯一允许“贪婪匹配”的语法,但限制极严:
-
GET /public/*filepath Static.Serve("public")✅ 匹配/public/a/b/c.js,filepath值为a/b/c.js -
GET /*filepath App.CatchAll❌ 虽然语法上可能通过,但会覆盖所有其他路由(因优先级最高),实际开发中应避免 -
GET /files*filepath Files.Serve❌ 缺少斜线,*filepath不生效,变成字面量匹配 - 注意:静态文件服务中,
Static.Serve("public", "img/favicon.png")的两个参数间**不能有空格**,否则 CSV 解析失败
WebSocket 路由用 WS 前缀,签名要带 *websocket.Conn
WebSockets 不走 HTTP handler 链,必须显式声明协议类型:
-
WS /chat/:room Chat.Join→ 对应方法签名必须是func(c Chat)Join(ws *websocket.Conn, room string) revel.Result - 如果漏掉
ws *websocket.Conn参数,运行时会 panic,错误信息类似missing websocket.Conn argument - 路径参数规则和 HTTP 路由一致,
:room同样进c.Params,但建议直接从函数参数接收,更安全
最容易被忽略的是:路由顺序决定优先级,越靠前越先匹配;而 *filepath 和 /:controller/:action 这类泛匹配必须放在文件底部,否则会吞掉本该由具体路由处理的请求。



















