c.Router().URI()生成相对路径URL,需参数名严格匹配路由变量名、大小写敏感,仅支持GET别名,模板中需手动注册url函数,不生成绝对URL,别名重复会在启动时panic。

用 c.Router().URI() 生成相对路径 URL
在请求处理函数里,直接调用上下文的 Router().URI() 方法是最常用的方式。它返回的是相对路径(如 /users/123),不带协议和域名,适合内部跳转或拼接前端链接。
常见错误现象:传参键名和路由定义中变量名不一致,比如路由是 /users/{userID:int},却传 iris.Map{"id": 123},结果生成 /users/{userID:int} —— 占位符没被替换,且无报错。
- 参数名必须严格匹配路由定义中的变量名,大小写敏感
- 只支持 GET 路由注册时设置的别名;POST/PUT 等方法注册的别名不会被
URI()识别 - 若传入不存在的参数键,占位符原样保留,不会 panic,但结果不可用
- 空值或零值参数(如
0、"")会被正常代入,需业务层自行校验
模板中用 url 函数生成链接要先注册
Iris 模板默认不提供 url 或 urlpath 这类辅助函数,必须手动注册才能在 .html 里写 {{ url "user.detail" .ID }} 这样的表达式。
容易踩的坑:注册时用了 app.GetRouter().URI(),但 handler 中用的是 c.Router().URI() —— 两者行为一致,但若注册时传了 nil 或未初始化的 router 实例,模板渲染会 panic。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 注册必须在
app.RegisterView()之后、app.Run()之前完成 - 推荐用
app.GetRouter().URI(name, args),避免在模板函数里依赖iris.Context - 参数
args支持map[string]interface{}或结构体,但结构体字段名需首字母大写且与路由变量名匹配 - 不要在模板函数里做错误处理(如 try-catch),Iris 渲染失败会直接中断响应
Router().URI() 不生成绝对 URL,别指望自动加域名
c.Router().URI("user.detail", iris.Map{"id": 123}) 永远只返回路径部分,例如 /users/123。它不读取 Host 头、不检查 TLS、也不看当前请求是 HTTP 还是 HTTPS。
使用场景:生成站内链接、重定向目标、API 响应中的 HATEOAS 字段。如果真需要完整 URL(如邮件通知、第三方回调地址),得自己拼:
"https://" + ctx.Host() + c.Router().URI("user.detail", ...)- 注意
ctx.Host()可能是localhost:8080,生产环境建议从配置或X-Forwarded-Host头提取可信域名 - HTTPS 判断不能只靠端口,应结合
ctx.Request().TLS != nil或反向代理头 - 别在中间件里提前调用
c.Router().URI()并缓存结果——路由参数是 per-request 的,缓存会导致 ID 错乱
别名重复或未定义时 panic 发生在启动阶段
路由别名不是运行时动态注册的,而是在 app.Get() 等注册调用时立即校验。一旦出现重复别名(如两个 "user.detail"),app.Run() 启动时就会 panic 报 duplicate route name "user.detail",服务根本起不来。
性能影响:别名查找是 O(1) 哈希查表,不影响请求吞吐量;但别名过多(几千个)可能略微增加内存占用,不过这在真实项目中极少见。
- 别名必须是合法标识符:只能含字母、数字、点(.)、下划线(_),不能以数字开头,不能含空格或斜杠
- 别名作用域是全局的,
Party分组内注册的别名也参与全局去重 - 没有“删除别名”或“运行时修改别名”的 API,改名等于重构所有调用点
- 测试时若用
iris.New()创建多个 app 实例,每个实例的别名空间独立,互不影响


















