app.get和app.post必须传handler才能注册成功,不传则路由无效;url参数用ctx.urlparam(),路径参数用ctx.params().get(),二者不可混淆。

app.Get 和 app.Post 必须传 handler 才会注册成功
不传处理函数,路由就等于没写。比如 app.Get("/user") 单独出现,不会注册任何路由;必须写成 app.Get("/user", handlerFunc)。Iris 不会报错,但请求 404,容易误以为是路径写错或服务没启。
常见错误现象:curl http://localhost:8080/user 返回 404,日志里也看不到该路由被加载的痕迹。
- handler 函数签名固定为
func(ctx iris.Context),不能用context.Context(那是标准库类型,Iris 自己的iris.Context才对) - 如果想复用逻辑,把 handler 抽成变量或函数,确保它类型匹配,别漏掉参数名或类型
- 调试时可加一行
app.Logger().Infof("registered GET /user")在 handler 开头,确认是否真进来了
GET 路由怎么取 URL 参数和路径参数
URL 参数(query string)用 ctx.URLParam("key"),比如 /search?keyword=go&limit=10 中取 keyword;路径参数(如 /user/123)要用 ctx.Params().Get("id"),前提是路由定义写了占位符,例如 app.Get("/user/{id}", ...)。
容易踩的坑:混淆 URLParam 和 Params().Get。前者读 ? 后面的键值,后者读 {xxx} 里的命名段。两者不互通,也不能混用。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 路径参数支持类型约束,如
/user/{id:uint64},这时必须用ctx.Params().GetUint("id"),否则解析失败返回 0 或 panic - 没有匹配的 URL 参数时,
ctx.URLParam("missing")返回空字符串,不会 panic;但ctx.Params().Get("missing")也返回空串,得靠业务逻辑判断是否合法 - 若需同时支持 query + path 参数,两个方法可以一起用,无冲突
POST 路由怎么区分表单、JSON 和原始 body
Iris 对不同 Content-Type 自动适配解析方式,但前提是调用对应方法。表单数据(application/x-www-form-urlencoded 或 multipart/form-data)用 ctx.PostValue("field");JSON 数据用 ctx.ReadJSON(&v);原始字节流用 ctx.Body()。
典型错误:往 POST 接口发 JSON,却在代码里只调 ctx.PostValue,结果全为空;或者没声明结构体 tag,导致字段无法绑定。
- JSON 解析失败时,
ReadJSON返回 error,建议直接检查 err 并返回 400,不要忽略 - 表单字段名区分大小写,且不含下划线转驼峰等自动转换,结构体字段 tag 如
form:"user_name"必须显式写 - 如果前端发的是纯文本或自定义格式,别依赖
PostValue,老实用ctx.Body()拿原始字节再手动解析
Handle 方法能覆盖所有 HTTP 方法,但别滥用
app.Handle("PUT", "/item", handler) 这种写法完全合法,适用于非标准方法、WebDAV、自定义协议等场景。但日常开发中,优先用 app.Put、app.Delete 等语义化方法——它们更直观,IDE 更好提示,团队协作也少歧义。
真正需要 Handle 的情况其实不多:比如要统一拦截所有 OPTIONS 请求做 CORS 预检,或对接遗留系统用了非标准 method 名。
-
Handle第一个参数是字符串,大小写敏感,必须拼写准确,如"OPTIONS"不能写成"options" - 多个
Handle("GET", ...)注册同一路径,后注册的会覆盖前一个,而app.Get重复注册会 panic,行为不一致 - 用
Handle时,别忘了自己处理 method 不匹配的响应,比如对不支持的 method 返回 405
app.Get、app.Post 必须在 app.Run 之前执行完,放到 goroutine 里异步注册会导致路由丢失,而且没有任何提示。










