revel中url参数统一存入c.params,路径参数优先绑定方法签名,查询参数用c.params.get()安全读取,routes文件不支持query语法。

Revel 中 URL 参数分三类,但都进 c.Params
路径参数(如 /user/123 中的 123)、查询参数(如 /user?name=alice 中的 name=alice)、表单数据(POST 的 application/x-www-form-urlencoded)——Revel 不区分来源,统一塞进 c.Params 这个 url.Values 类型对象里。你不需要在 routes 文件里写 ?name:string,那会直接导致路由匹配失败。
c.Params.Get("key") 是最安全的查询参数读取方式
对 GET /company?name=ABC&category=tech 这类请求,直接在控制器里调用:
name := c.Params.Get("name") // 返回 "ABC"
category := c.Params.Get("category") // 返回 "tech"
missing := c.Params.Get("foo") // 返回 ""(空字符串,不是 nil)
-
Get()内部调用的是url.Values.Get(),自动合并所有同名 query 参数,只取第一个值 - 若需获取全部同名值(比如
?tag=a&tag=b&tag=c),改用c.Params.Values["tag"],它返回[]string - 不要依赖
c.Params.Form读 query 参数——它只存表单体内容,不包含 query string
路径参数优先走控制器方法签名绑定
对于带路径变量的路由 GET /user/{id} 或 GET /user/:id,推荐直接把参数声明为方法入参:
func (c UserController) Show(id string) revel.Result {
// id 自动从 /user/abc 或 /user/123 中提取并转为 string
}
- 类型支持
string、int、int64、bool等;若转换失败(如/user/abc绑定到id int),id取零值,不会 panic - 若需更精细控制(比如容错、日志、或多个可选路径段),改用
c.Params.Get("id")手动提取 - 注意:路径参数名必须和路由中定义的一致(
{id}→id,:uid→uid),大小写敏感
别在 routes 文件里拼 query 字符串
以下写法全是错的,会导致路由无法匹配:
GET /company?name:string APP.ShowByName // ❌ 无效语法
GET /company/:name?category APP.ShowByName // ❌ 混合写法,解析失败
GET /company/{name}?v=1 APP.ShowByName // ❌ ? 后内容被忽略,且破坏 REST 风格
- routes 文件只管路径匹配,query 参数永远不参与路由选择
- 正确写法是保持路径干净:
GET /company APP.ShowByName - 如果需要强制校验某个 query 参数存在,必须在控制器里手动检查
c.Params.Get("name") != ""
最容易被忽略的是:路径参数和 query 参数在 c.Params 里共用同一个键空间。比如路由是 GET /user/{id},又带 ?id=999,那么 c.Params.Get("id") 返回的是路径段的值,不是 query 值——没有优先级约定,实际行为取决于框架内部插入顺序,别依赖它。











