iris的uuid路由宏仅做格式校验,不验证版本或语义合法性;需在handler中用uuid.parse()二次解析并检查version()和是否为nil,或注册自定义v4宏实现精确匹配。

iris 路由宏函数中 UUID 的实际校验行为
iris 的 UUID 宏(如 /{id:uuid})**只做格式校验,不验证 UUID 版本或语义合法性**。它底层调用的是 uuid.Parse()(来自 github.com/google/uuid),仅拒绝明显非法字符串(如含非十六进制字符、长度不对),但不会区分 v1/v4/v5,也不检查 nil UUID(00000000-0000-0000-0000-000000000000)是否被允许。
这意味着:/user/00000000-0000-0000-0000-000000000000 会被 /:id:uuid 接收,即使业务上该 ID 应为有效生成的 v4 UUID。
如何在 handler 中补充版本或业务级校验
宏校验通过后,仍需在 handler 内手动检查 UUID 实例属性。常见做法:
- 用
uuid.Parse()二次解析(虽冗余但可控),再调用.Version()判断是否为 v4 - 检查
uuid.Equal(uuid.Nil)排除空值 - 若使用自定义 UUID 类型(如带业务前缀的 string),宏无法覆盖,必须在 handler 中解析并校验
示例:
app.Get("/item/{id:uuid}", func(ctx iris.Context) {
idStr := ctx.Params().Get("id")
u, err := uuid.Parse(idStr)
if err != nil || u.Version() != uuid.Version4 || u == uuid.Nil {
ctx.StatusCode(iris.StatusBadRequest)
ctx.JSON(iris.Map{"error": "invalid or non-v4 UUID"})
return
}
// 继续处理
})
自定义宏:支持 v4、v1 等显式版本约束
iris 允许注册自定义宏,比内置 uuid 更精确。注册后可写成 /{id:v4},避免每次重复判断。
注册方式(需在 app := iris.New() 后、路由注册前):
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
app.Macros().RegisterFunc("v4", func(param string) bool {
u, err := uuid.Parse(param)
return err == nil && u.Version() == uuid.Version4 && u != uuid.Nil
})
之后路由即可直接使用:
app.Get("/user/{id:v4}", handler)
注意:自定义宏函数返回 bool,且**不抛错**;失败时自动跳过该路由匹配,交由其他候选路由处理。
和 Gin 的 uuid 校验对比容易踩的坑
gin 没有内置 UUID 宏,通常靠中间件或结构体绑定(如 binding:"uuid4")校验,错误会统一转为 400;而 iris 宏是路由匹配层逻辑,失败即 404 —— 这容易让人误以为“路径不存在”,实际是参数格式被拒。
关键差异点:
- iris
/:id:uuid匹配失败 → HTTP 404(路由未找到) - Gin 结构体绑定
uuid4失败 → HTTP 400(请求体校验失败) - 两者都**不校验 UUID 是否真实存在于数据库**,那是 service 层职责
如果你的 API 文档承诺返回 400 表示参数错误,iris 默认行为就不符合,必须用自定义宏 + 显式 handler 校验来对齐语义。










