Skip to content

Iris 框架

Iris 是一个快速、简单但功能强大的 Go Web 框架,提供了丰富的功能和优秀的性能。

📋 学习目标

  • 理解 Iris 框架的特点和优势
  • 掌握 Iris 项目的创建和配置
  • 学会使用路由和中间件
  • 掌握视图渲染和模板
  • 理解依赖注入和 MVC 模式
  • 学会使用 Iris 的扩展功能

🎯 Iris 简介

为什么选择 Iris

  • 高性能: 基于 fasthttp,性能优秀
  • 功能丰富: 内置模板引擎、会话管理、WebSocket 等
  • 易于使用: API 设计简洁直观
  • 文档完善: 官方文档详细,示例丰富
  • 活跃维护: 持续更新,社区活跃

Iris vs Gin vs Beego

特性IrisGinBeego
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
功能完整性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐
适用场景全栈应用API 服务MVC 应用

🚀 快速开始

安装 Iris

bash
# 安装 Iris
go get github.com/kataras/iris/v12@latest

第一个 Iris 应用

go
package main

import (
	"github.com/kataras/iris/v12"
)

func main() {
	app := iris.New()

	app.Get("/", func(ctx iris.Context) {
		ctx.JSON(iris.Map{
			"message": "Hello, Iris!",
		})
	})

	app.Listen(":8080")
}

🛣️ 路由

基本路由

go
package main

import (
	"github.com/kataras/iris/v12"
)

func main() {
	app := iris.New()

	// GET 请求
	app.Get("/", handler)
	
	// POST 请求
	app.Post("/users", createUser)
	
	// PUT 请求
	app.Put("/users/{id:int}", updateUser)
	
	// DELETE 请求
	app.Delete("/users/{id:int}", deleteUser)
	
	// 任意方法
	app.Any("/any", anyHandler)
	
	// 多个方法
	app.HandleMany("GET POST", "/many", manyHandler)

	app.Listen(":8080")
}

func handler(ctx iris.Context) {
	ctx.WriteString("Hello, Iris!")
}

路由参数

go
app := iris.New()

// 路径参数
app.Get("/users/{id:int}", func(ctx iris.Context) {
	id := ctx.Params().GetIntDefault("id", 0)
	ctx.JSON(iris.Map{"id": id})
})

// 字符串参数
app.Get("/users/{name}", func(ctx iris.Context) {
	name := ctx.Params().Get("name")
	ctx.JSON(iris.Map{"name": name})
})

// 多个参数
app.Get("/users/{id:int}/posts/{postId:int}", func(ctx iris.Context) {
	id := ctx.Params().GetIntDefault("id", 0)
	postId := ctx.Params().GetIntDefault("postId", 0)
	ctx.JSON(iris.Map{
		"userId": id,
		"postId": postId,
	})
})

// 可选参数
app.Get("/users/{id:int?}", func(ctx iris.Context) {
	id := ctx.Params().GetIntDefault("id", 0)
	ctx.JSON(iris.Map{"id": id})
})

路由组

go
app := iris.New()

// 创建路由组
users := app.Party("/users")
{
	users.Get("/", listUsers)
	users.Get("/{id:int}", getUser)
	users.Post("/", createUser)
	users.Put("/{id:int}", updateUser)
	users.Delete("/{id:int}", deleteUser)
}

// 带中间件的路由组
api := app.Party("/api", authMiddleware)
{
	api.Get("/users", getUsers)
	api.Post("/users", createUser)
}

🔧 中间件

全局中间件

go
app := iris.New()

// 全局中间件
app.Use(func(ctx iris.Context) {
	ctx.Header("X-Custom-Header", "value")
	ctx.Next()
})

app.Get("/", handler)

路由组中间件

go
app := iris.New()

// 认证中间件
authMiddleware := func(ctx iris.Context) {
	token := ctx.GetHeader("Authorization")
	if token == "" {
		ctx.StatusCode(iris.StatusUnauthorized)
		ctx.JSON(iris.Map{"error": "未授权"})
		return
	}
	// 验证 token
	ctx.Next()
}

// 日志中间件
loggerMiddleware := func(ctx iris.Context) {
	start := time.Now()
	ctx.Next()
	duration := time.Since(start)
	log.Printf("%s %s - %v", ctx.Method(), ctx.Path(), duration)
}

// 应用到路由组
api := app.Party("/api", authMiddleware, loggerMiddleware)
{
	api.Get("/users", getUsers)
}

内置中间件

go
app := iris.New()

// 恢复中间件(处理 panic)
app.Use(recover.New())

// 日志中间件
app.Use(logger.New())

// CORS 中间件
app.Use(cors.New(cors.Options{
	AllowedOrigins: []string{"*"},
	AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
}))

// 压缩中间件
app.Use(compress.New())

📝 请求处理

获取请求参数

go
// 查询参数
app.Get("/search", func(ctx iris.Context) {
	query := ctx.URLParam("q")
	page := ctx.URLParamIntDefault("page", 1)
	ctx.JSON(iris.Map{
		"query": query,
		"page":  page,
	})
})

// 表单参数
app.Post("/login", func(ctx iris.Context) {
	username := ctx.PostValue("username")
	password := ctx.PostValue("password")
	// 处理登录
})

// JSON 请求体
app.Post("/users", func(ctx iris.Context) {
	var user struct {
		Name  string `json:"name"`
		Email string `json:"email"`
	}
	
	if err := ctx.ReadJSON(&user); err != nil {
		ctx.StatusCode(iris.StatusBadRequest)
		ctx.JSON(iris.Map{"error": err.Error()})
		return
	}
	
	// 处理用户创建
	ctx.JSON(iris.Map{"message": "创建成功", "user": user})
})

// 文件上传
app.Post("/upload", func(ctx iris.Context) {
	file, info, err := ctx.FormFile("file")
	if err != nil {
		ctx.StatusCode(iris.StatusBadRequest)
		return
	}
	defer file.Close()
	
	// 保存文件
	dst, _ := os.Create("./uploads/" + info.Filename)
	defer dst.Close()
	io.Copy(dst, file)
	
	ctx.JSON(iris.Map{"message": "上传成功"})
})

响应处理

go
// JSON 响应
app.Get("/json", func(ctx iris.Context) {
	ctx.JSON(iris.Map{
		"message": "Hello",
		"status":  "success",
	})
})

// 文本响应
app.Get("/text", func(ctx iris.Context) {
	ctx.Text("Hello, Iris!")
})

// HTML 响应
app.Get("/html", func(ctx iris.Context) {
	ctx.HTML("<h1>Hello, Iris!</h1>")
})

// XML 响应
app.Get("/xml", func(ctx iris.Context) {
	ctx.XML(iris.Map{"message": "Hello"})
})

// 文件下载
app.Get("/download", func(ctx iris.Context) {
	ctx.SendFile("./files/document.pdf", "document.pdf")
})

🎨 视图和模板

模板配置

go
app := iris.New()

// 配置模板
app.RegisterView(iris.HTML("./views", ".html"))

app.Get("/", func(ctx iris.Context) {
	ctx.ViewData("Title", "首页")
	ctx.ViewData("Users", []string{"张三", "李四"})
	ctx.View("index.html")
})

模板语法

html
<!-- views/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Title}}</h1>
    <ul>
        {{range .Users}}
        <li>{{.}}</li>
        {{end}}
    </ul>
</body>
</html>

布局模板

html
<!-- views/layouts/main.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <header>Header</header>
    {{render}}
    <footer>Footer</footer>
</body>
</html>
go
app.RegisterView(iris.HTML("./views", ".html").Layout("layouts/main.html"))

📊 数据库集成

使用 GORM

go
package main

import (
	"github.com/kataras/iris/v12"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string
	Email string
}

var db *gorm.DB

func init() {
	var err error
	dsn := "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("数据库连接失败")
	}
	
	db.AutoMigrate(&User{})
}

func main() {
	app := iris.New()

	app.Get("/users", func(ctx iris.Context) {
		var users []User
		db.Find(&users)
		ctx.JSON(users)
	})

	app.Post("/users", func(ctx iris.Context) {
		var user User
		if err := ctx.ReadJSON(&user); err != nil {
			ctx.StatusCode(iris.StatusBadRequest)
			return
		}
		
		db.Create(&user)
		ctx.JSON(user)
	})

	app.Listen(":8080")
}

🔐 会话管理

Session 配置

go
app := iris.New()

// 配置 Session
sess := sessions.New(sessions.Config{
	Cookie:  "sessionid",
	Expires: 24 * time.Hour,
})

app.Use(sess.Handler())

app.Post("/login", func(ctx iris.Context) {
	session := sessions.Get(ctx)
	session.Set("user_id", 1)
	session.Set("username", "admin")
	
	ctx.JSON(iris.Map{"message": "登录成功"})
})

app.Get("/profile", func(ctx iris.Context) {
	session := sessions.Get(ctx)
	userID := session.GetIntDefault("user_id", 0)
	
	if userID == 0 {
		ctx.StatusCode(iris.StatusUnauthorized)
		return
	}
	
	ctx.JSON(iris.Map{"user_id": userID})
})

🏗️ MVC 模式

控制器

go
package controllers

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
)

type UserController struct {
	// 可以注入依赖
}

// Get 处理 GET /users
func (c *UserController) Get() iris.Map {
	return iris.Map{
		"message": "获取用户列表",
	}
}

// GetBy 处理 GET /users/{id:int}
func (c *UserController) GetBy(id int) iris.Map {
	return iris.Map{
		"id":      id,
		"message": "获取用户",
	}
}

// Post 处理 POST /users
func (c *UserController) Post() iris.Map {
	return iris.Map{
		"message": "创建用户",
	}
}

注册控制器

go
app := iris.New()

mvc.New(app.Party("/users")).Handle(new(controllers.UserController))

🚀 实践应用

完整的 CRUD API

go
package main

import (
	"github.com/kataras/iris/v12"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	ID    uint   `gorm:"primaryKey" json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

var db *gorm.DB

func init() {
	var err error
	dsn := "root:password@tcp(localhost:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("数据库连接失败")
	}
	db.AutoMigrate(&User{})
}

func main() {
	app := iris.New()

	// 获取用户列表
	app.Get("/users", func(ctx iris.Context) {
		var users []User
		db.Find(&users)
		ctx.JSON(users)
	})

	// 获取单个用户
	app.Get("/users/{id:int}", func(ctx iris.Context) {
		id := ctx.Params().GetIntDefault("id", 0)
		var user User
		if err := db.First(&user, id).Error; err != nil {
			ctx.StatusCode(iris.StatusNotFound)
			ctx.JSON(iris.Map{"error": "用户不存在"})
			return
		}
		ctx.JSON(user)
	})

	// 创建用户
	app.Post("/users", func(ctx iris.Context) {
		var user User
		if err := ctx.ReadJSON(&user); err != nil {
			ctx.StatusCode(iris.StatusBadRequest)
			ctx.JSON(iris.Map{"error": err.Error()})
			return
		}
		db.Create(&user)
		ctx.StatusCode(iris.StatusCreated)
		ctx.JSON(user)
	})

	// 更新用户
	app.Put("/users/{id:int}", func(ctx iris.Context) {
		id := ctx.Params().GetIntDefault("id", 0)
		var user User
		if err := db.First(&user, id).Error; err != nil {
			ctx.StatusCode(iris.StatusNotFound)
			ctx.JSON(iris.Map{"error": "用户不存在"})
			return
		}
		if err := ctx.ReadJSON(&user); err != nil {
			ctx.StatusCode(iris.StatusBadRequest)
			ctx.JSON(iris.Map{"error": err.Error()})
			return
		}
		db.Save(&user)
		ctx.JSON(user)
	})

	// 删除用户
	app.Delete("/users/{id:int}", func(ctx iris.Context) {
		id := ctx.Params().GetIntDefault("id", 0)
		db.Delete(&User{}, id)
		ctx.JSON(iris.Map{"message": "删除成功"})
	})

	app.Listen(":8080")
}

⚠️ 注意事项

1. 错误处理

go
app.OnErrorCode(iris.StatusNotFound, func(ctx iris.Context) {
	ctx.JSON(iris.Map{"error": "页面未找到"})
})

app.OnErrorCode(iris.StatusInternalServerError, func(ctx iris.Context) {
	ctx.JSON(iris.Map{"error": "服务器内部错误"})
})

2. 性能优化

go
app := iris.New()

// 启用压缩
app.Use(compress.New())

// 启用缓存
app.Use(cache.Handler(2 * time.Minute))

// 静态文件服务
app.HandleDir("/static", "./static")

3. 配置管理

go
app := iris.New()

app.Configure(iris.WithOptimizations) // 生产环境优化

app.Listen(":8080", iris.WithConfiguration(iris.Configuration{
	DisableStartupLog: false,
	EnableOptimizations: true,
}))

📚 扩展阅读

⏭️ 下一阶段

完成 Iris 学习后,可以:


💡 提示: Iris 是一个功能强大且性能优秀的 Web 框架,适合构建各种类型的 Web 应用。掌握 Iris 可以快速开发高性能的 Web 服务!

基于 VitePress 构建