Iris路由必须挂载到实例而非调用全局iris.Get(),v12+已移除该方法;正确写法是app.Get("/path", handler),否则路由不生效。

Iris 是一个高性能 Go Web 框架,但“完整教程”不是它的强项——它不追求开箱即用的脚手架,也不内置 ORM、迁移工具或身份认证中间件。你得自己选、自己配、自己兜底。
为什么 iris.New() 后不能直接用 iris.Get()
常见错误:写完 app := iris.New(),紧接着写 iris.Get(...),结果路由完全不生效。
原因很简单:iris.Get() 是旧版(v11 及以前)的全局注册方式,v12+ 已彻底移除。所有路由必须挂载到具体实例上。
- 正确写法是
app.Get("/users", handler)或app.Handle("GET", "/users", handler) - 如果你看到文档里还有
iris.Get,说明你查的是过时的官网示例或第三方博客 - v12 起默认禁用全局状态,避免 goroutine 间意外共享配置
ctx.JSON() 返回空对象或 panic 的三种典型场景
这是最常被问的问题之一:结构体字段没值、字段名拼错、嵌套指针 nil,都可能让 ctx.JSON(200, data) 输出 {} 或直接 panic。
- Go 的 JSON 序列化只导出首字母大写的字段,
type User struct { name string }→ 永远为空,必须写成Name string并加json:"name"tag - 如果字段类型是
*string且值为nil,默认会输出null;想跳过该字段,用json:",omitempty" - 不要对未初始化的 map/slice 直接赋值,
var m map[string]string是 nil,json.Marshal(m)会得到null,不是{}
如何安全地绑定 JSON 请求体到结构体(ctx.ReadJSON())
ctx.ReadJSON(&v) 看似简单,但生产环境必须处理三类失败:非法 JSON、字段类型不匹配、必填字段缺失。
- 永远检查返回 error:
if err := ctx.ReadJSON(&req); err != nil { ctx.StatusCode(400); ctx.WriteString(err.Error()); return } - 用
validate标签(如json:"email" validate:"required,email")配合validator包校验,iris自带的ctx.ReadBody()不做结构校验 - 别用
interface{}接收任意 JSON —— 它会让后续类型断言变得脆弱,且无法静态校验字段
中间件里怎么提前终止请求(比如鉴权失败)
很多人写中间件时用 return 就以为结束了,结果 handler 还是执行了。
-
ctx.Next()是关键:它表示“继续执行下一个 handler”,不调用它,链就断了 - 鉴权失败应写
ctx.StatusCode(401); ctx.JSON(map[string]string{"error": "unauthorized"}); return—— 注意这里return是退出当前中间件函数,但必须确保没调用ctx.Next() - 误写成
ctx.StopExecution()在新版中已废弃;等效的是ctx.Abort(),但它只是标记“不再往下走”,仍需手动写响应
Iris 的灵活性来自它的轻量,代价是你得清楚每个函数调用背后的状态流转。最容易被忽略的,是它对 Go 原生 http.Handler 兼容性极好——你可以随时混用标准库中间件,但反过来,别指望 iris.Context 能直接当 http.ResponseWriter 用。


















