路由参数类型声明必须写在花括号内(如{id:uint64}),否则iris默认全作字符串处理;声明仅影响匹配阶段,取值仍需用ctx.params().getuint64等方法安全转换,且参数名必须与路由定义完全一致。

路由参数类型声明必须写在花括号里,不能靠后端校验补救
Iris 不会在运行时自动把 {id} 当成整数处理——它默认全当字符串。如果你只写 /user/{id},哪怕前端传 /user/123,ctx.Params().Get("id") 拿到的仍是 "123" 这个字符串。想让框架在匹配阶段就拒绝非法值(比如 /user/abc),必须显式声明类型。
- 支持的内置类型有:
int、int64、uint、uint64、string、bool、float64 - 写法是
{id:uint64}或{name:string},不是{id} : uint64这种语法 - 一旦声明了
uint64,/user/-1或/user/abc会直接 404,根本不会进 handler - 类型声明只影响路由匹配,不改变取值方式:仍用
ctx.Params().Get("id")拿字符串,或用ctx.Params().GetUint64("id")直接转数字(失败返回 0 和 error)
用 GetUint64 等方法比手动 strconv 更安全
即使路由写了 {id:uint64},ctx.Params().Get("id") 返回的还是字符串。新手常在这里掉坑:拿到字符串后自己用 strconv.ParseUint(..., 10, 64) 转,但没检查 error,导致后续 panic。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
-
ctx.Params().GetUint64("id")内部已做容错,失败时返回0和非 nil error,可直接判断 - 如果路由没声明类型(如
{id}),但业务上必须是数字,也建议用GetUint64而不是Get+strconv—— 前者统一处理空值、格式错误等边界 - 注意:
GetUint64对空字符串或非法值返回0,不是nil;所以不能只判返回值是否为 0,必须检查 error 是否为 nil
自定义类型约束要靠 macro,不是结构体 tag
想限制 {id} 必须是数据库存在的主键?或者必须是 1~100 的范围?Iris 不提供开箱即用的「存在性校验」或「范围校验」。这类逻辑得自己实现 macro,而不是往结构体字段加 validate:"min=1,max=100" 这种 tag。
- macro 是 Iris 的扩展机制,用于注册自定义路由参数解析规则,例如
{id:validID} - 注册方式是调用
app.Macros().Register,传入正则和解析函数;解析失败则整个路由不匹配 - 常见误区:试图用 JSON 结构体的 validator tag 控制路径参数——完全无效,因为路径参数解析发生在请求体解码之前
- 简单范围检查可用正则替代,比如
{id:regexp(^[1-9][0-9]{0,5}$)}表示 1~999999 的正整数
拼错参数名不会报错,只会返回空字符串
这是最隐蔽的坑:路由定义是 /order/{orderID:uint64},但 handler 里写 ctx.Params().GetUint64("id") ——结果永远是 0 和 error,且不 panic,容易一路 pass 到数据库查 WHERE id = 0 才暴露问题。
- 务必确保
GetXXX("xxx")的字符串和路由花括号里的名字**完全一致**,包括大小写 - 建议在 handler 开头加断言或日志:比如
id, err := ctx.Params().GetUint64("orderID"); if err != nil { ctx.StatusCode(400); return } - IDE 无法对字符串字面量做跳转,所以命名尽量简短直白,避免
orderIdentifier这类长名增加出错概率










