Revel框架中标准RESTful路由需手动在conf/routes中逐条声明,路径用复数名词、不带动作动词,路径参数用{id}占位符,由框架自动绑定到控制器方法对应参数。

Revel框架里怎么定义标准RESTful路由
Revel不靠注解或自动扫描生成资源路由,必须手动在 conf/routes 文件里逐条声明,且路径中不能带动词。比如用户资源的完整CRUD,得这样写:
GET /api/users APP.IndexPOST /api/users APP.CreateGET /api/users/{id} APP.ShowPUT /api/users/{id} APP.UpdateDELETE /api/users/{id} APP.Destroy
注意两点:一是所有路径用复数名词 users,不是 user;二是 {id} 是路径参数占位符,不是查询字符串,Revel会自动绑定到控制器方法的 id 参数上。
控制器方法怎么接收和校验参数
Revel的控制器方法签名必须显式声明参数,路径参数、查询参数、表单数据要分开处理。比如 APP.Show 方法接收 id,就得写成:
func (c App) Show(id string) revel.Result {
// id 已从 /users/{id} 中解析出来,但仍是字符串
userID, err := strconv.ParseInt(id, 10, 64)
if err != nil {
return c.RenderError("invalid user ID")
}
// ...
}
常见坑点:
- 路径参数默认是
string类型,别直接当整数用,strconv.ParseInt是必走步骤 - 查询参数(如
/users?limit=10&offset=0)要用c.Params.Get("limit")拿,不是c.Params.Route.Get - POST/PUT 的 JSON body 需手动调用
c.Params.JSON解析,Revel 不自动绑定结构体
状态码和响应格式怎么统一控制
Revel 默认返回 200,但 RESTful 要求严格匹配语义。创建成功必须返回 201,删除成功应返回 204,这些得手动设:
-
return c.RenderJSON(map[string]interface{}{"id": newID})→ 自动 200 -
c.Response.Status = "201 Created"+return c.RenderJSON(...)→ 强制 201 -
c.Response.Status = "204 No Content"+return nil→ 删除后无 body
错误响应别用 c.RenderError 直接抛,它返回 HTML 页面,API 应该返回 JSON:
func (c App) RenderErrorJSON(msg string, code int) revel.Result {
c.Response.Status = fmt.Sprintf("%d %s", code, http.StatusText(code))
return c.RenderJSON(map[string]interface{}{
"error": msg,
"status": code,
})
}
嵌套资源和分页参数怎么处理
嵌套资源如 /users/1/orders,需要额外加一条路由:GET /api/users/{userId}/orders APP.ListUserOrders,然后在方法里用 c.Params.Get("userId") 提取父级 ID。
分页参数通常走查询字符串,但 Revel 对可选参数没约束机制,容易漏校验:
-
limit和offset必须做范围检查(如 limit > 100 就截断) - 别信任前端传来的
offset,大 offset 查询性能差,建议改用游标(cursor)方式 - 如果用了
?page=2&size=20这类风格,需在控制器里手动转换为数据库偏移量
真正难的不是写对这几个 URL,而是让整个团队在新增接口时,始终记得路径只放名词、方法决定动作、状态码不可省略——这些细节一旦松动,很快就会退回 /getOrderById 风格。


















