新闻
> 🚀 **Iris v14 即将到来。** 下一个大版本是本项目历史上最大的一次发布:基于 Go 泛型重建的框架、由编译器检查的应用构建器、替你完成校验的请求辅助函数、统一的错误映射表、三十个内置中间件,以及随仓库一同发布的一本书。详情见下方的 [Iris v14 带来了什么](#-iris-v14-带来了什么)。
>
> 这里介绍的 **v12** 仍然可用,也仍在持续修复。v14 使用新的 import 路径,所以它发布的那天,你这边不会有任何东西被破坏。
#
Iris Web Framework English
العربية
[](https://github.com/kataras/iris/actions/workflows/ci.yml) [](https://github.com/kataras/iris/tree/main/_examples) [](https://gitter.im/iris_go/community) [](https://iris-go.com/donate)
⚡ Iris 是基于 Go 编写的一个快速、简单但功能齐全且非常高效的 Web 框架。
✨ 它为您的下一个网站或 API 提供了非常富有表现力且易于使用的基础。
🌟 看看[其他人如何评价 Iris](https://www.iris-go.com/#review),同时欢迎为此开源项目点亮 **[star](https://github.com/kataras/iris/stargazers)**
[](https://iris-go.com/testimonials/)
[](https://github.com/kataras/server-benchmarks)
```go
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New()
app.Use(iris.Compression)
app.Get("/", func(ctx iris.Context) {
ctx.HTML("Hello %s!", "World")
})
app.Listen(":8080")
}
```
正如一位 [Go 开发者](https://twitter.com/dkuye/status/1532087942696554497)所说,**Iris 面面俱到,多年来始终坚挺** ⭐
Iris 提供的部分功能:
* HTTP/2(Push,甚至支持内嵌数据)
* 中间件(Accesslog、Basicauth、CORS、gRPC、防机器人 hCaptcha、JWT、MethodOverride、ModRevision、Monitor、PPROF、Ratelimit、防机器人 reCaptcha、Recovery、RequestID、Rewrite)
* API 版本管理
* Model-View-Controller
* Websockets
* gRPC
* 自动 HTTPS
* 内置 ngrok 支持,把应用发布到公网最快的方式
* 独特的路由,支持把动态路径作为参数,内置 :uuid、:string、:int 等标准类型,也可以自定义
* 压缩
* 视图引擎(HTML、Django、Handlebars、Pug/Jade 等)
* 构建自己的文件服务器,托管自己的 WebDAV 服务
* 缓存
* 本地化(i18n、sitemap)
* 会话(Sessions)
* 丰富的响应(HTML、Text、Markdown、XML、YAML、Binary、JSON、JSONP、Protocol Buffers、MessagePack、内容协商、流式传输、Server-Sent Events 等)
* 响应压缩(gzip、deflate、brotli、snappy、s2)
* 丰富的请求(绑定 URL Query、Headers、Form、Text、XML、YAML、Binary、JSON、校验、Protocol Buffers、MessagePack 等)
* 依赖注入(MVC、Handlers、API Routers)
* 测试套件
* 以及最重要的一点……从第一天到今天,你都能得到快速的回复和支持
## 🚀 Iris v14 带来了什么
Iris v14 是本项目历史上最大的一次发布。它把框架重建在 Go 泛型之上,也改变了一个应用的组装方式:`main` 里的接线更少,处理函数更短,那些以前散落在每条路由上的决定,现在只在一个地方做。
这些今天都不需要你操心。v12 继续可用,继续收到修复,而 v14 会带着一份覆盖每个重命名和移除 API 的迁移指南一起到来。
### 整个应用写在一条由编译器检查的链里
`iris.NewBuilder` 用一个表达式把 CORS、压缩、访问日志、健康检查端点、错误映射表、你的服务和 API 分组连接起来。步骤顺序由编译器强制,所以应用要么正确构建,要么根本编译不过。
```go
iris.NewBuilder().
Prefix("/api").
AllowOrigin("*").
Compression(true).
LogRequests(true).
Health(true, "production", "kataras").
Errors(errors.NewOptions().
MapErrors(errors.NotFound, catalog.ErrNotFound)).
Services(catalog.NewRepository, catalog.NewService).
API("/products", api.NewProductsAPI).
Build().
Listen(":8080")
```
### 处理函数不再重复自己
解码、校验和错误渲染都搬出了处理函数的函数体。`rest.ReadJSON[T]` 解码请求,如果你的类型实现了 `Validate() error` 就顺带执行它,并自己写出 400。响应辅助函数写出成功状态码,或者写出你的中央映射表为该错误指定的响应。
```go
func (api *ProductsAPI) create(ctx iris.Context) {
input, ok := rest.ReadJSON[catalog.ProductInput](ctx)
if !ok {
return // 400 已写出:JSON 格式错误,或 Validate 未通过。
}
id, err := api.svc.Create(ctx, input)
rest.Created(ctx, id, err) // 201,或集中映射后的错误。
}
```
`rest.OK`、`rest.NoContent`、`rest.Count` 和 `rest.Paginated` 覆盖了 API 返回的其余形态。
### 错误只声明一次
新的 `rest/errors` 包保存着从你的领域错误到 HTTP 响应的映射。客户端拿到规范的、机器可读的响应体。内部信息留在内部。注册一个 collector,每一次失败都会从同一个地方进入你的日志或数据库。错误可以渲染为 JSON,也可以渲染为视图,取决于客户端想要什么。
### 依赖注入无处不在,不再只属于 MVC
构造函数声明自己需要什么,容器负责提供:处理函数、API 分组、控制器都一样。实现了 `Init(ctx context.Context) error` 的服务会在 `Build()` 内部执行一次。可关闭的资源会在关停时关闭。`hero` 包不再存在,取而代之的是 `dep` 和 `rest`,用更少的代码做更多的事。MVC 控制器建立在泛型之上。
### 包都在你以为它们该在的地方
`sessions`、`cache`、`websocket`、`i18n`、`view` 和 `versioning` 都成了中间件。`mvc` 移到了 `controller` 之下,与新的 `fileserver`、`sitemap` 和 `apigraph` 控制器并列。`apigraph` 会把你的路由树画成一张可交互的 D3 图。
框架内置三十个中间件,其中包括这些新成员:`httpcost`(每个请求的时间、内存和 CPU,用于性能分析或计费)、`bodylimit`、`compress`、`counter`、`referrer`、`geolocation`、`ipaccess` 和 `servertiming`。视图引擎的实现迁移到了 [iris-contrib/views](https://github.com/iris-contrib/views)。
### 配置是一个部分字面量
`iris.Configuration` 和那些 `With*` 配置器由 `iris.Options` 取代。只写你关心的字段,其余的来自默认值。`Bind` 先从 `SERVER_CONFIG` 环境变量读取 YAML,然后再从文件读取。
```go
app := iris.New(iris.Options{Name: "myapp", LogLevel: "debug"})
```
### 名字如实说明它在做什么
读请求头和设置响应头不再共用一个会悄悄改变含义的前缀:`ctx.Header` 读取请求,而 `ctx.SetHeader` 和 `ctx.ResponseHeader` 作用于响应。`Party` 现在叫 `Router`。`ctx.URLParam` 现在是 `ctx.Query().Get`。每一处重命名都连同替代写法列在迁移指南里,其中大多数只需一次查找替换。
### 默认就是安全的
会话 cookie 默认带上 `Secure` 和 `SameSite=Lax`。请求体大小限制在所有读取路径上都会生效。重建的过程中也顺手解决了一批老问题,其中包括一个只记录限制却从不真正执行的限流器,以及一次可能把整个进程带走的 `Logout` 调用。
### 可以从头读到尾的文档
v14 附带一本收录在仓库里的 23 章图书、一份用单篇文档写出带测试的 REST API 的入门教程、一份面向 v12 应用的迁移指南,以及一个由源码生成、可以回答代码库问题的实时 AI wiki。
### 这对你的 v12 代码意味着什么
import 路径变为 `github.com/kataras/iris/v14`,因此 v12 和 v14 可以并存,发布当天不会有任何东西被破坏。什么时候升级由你决定。迁移指南覆盖 import 路径、包的移动、每一个被移除的 API 及其替代品,以及行为上的变化,机械的部分还给出了可直接执行的命令。
目前还没有公开的发布日期。关注 [releases](https://github.com/kataras/iris/releases) 或者 [@iris_framework](https://twitter.com/iris_framework),第一时间收到消息。
## 👑 赞助者
有了你们的帮助,我们可以让开源 Web 开发对所有人都更好!
## 📖 开始学习 Iris
### 安装
唯一的要求是 [Go 编程语言](https://go.dev/dl/)。
#### 创建新项目
```sh
$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest # 或 @v12.2.11
```
在已有项目中安装
```sh
$ cd myapp
$ go get github.com/kataras/iris/v12@latest
```
**运行**
```sh
$ go mod tidy -compat=1.23 # windows 下用 -compat="1.23"。
$ go run .
```

Iris 有完整且详尽的 **[使用文档](https://www.iris-go.com/docs)**,让您可以轻松地上手此框架。
要了解更详细的技术文档,请访问我们的 [godocs](https://pkg.go.dev/github.com/kataras/iris/v12@v12.2.11)。如果想要寻找可运行的示例代码,可以到仓库的 [./_examples](_examples) 子目录下获取。
### 用 Plexon AI 开发
[Plexon AI](https://plexon.ai) 是 Hellenic Development 推出的跨平台 AI 编程助手,它内置了一个专门的 **Iris 技能(skill)**:一份由框架作者亲自撰写的 v14 开发指南,包含十九篇参考文档,覆盖路由与宏、context API、`rest` 辅助函数、错误处理、全部三十个中间件、内置控制器、认证 SDK、安全加固、数据持久化、缓存、i18n、可观测性、性能、测试、部署,以及从 v12 到 v14 的迁移。
安装 **Software Developer** 人格(persona),Iris 技能会随之而来,与它启用的一批工程类 agent 并列。这样一来,助手写出的 Iris 代码就是框架本该被使用的样子,而不是靠训练时见过的零碎印象去猜。
### 你喜欢在旅行时阅读吗?
[](https://twitter.com/intent/follow?screen_name=makismaropoulos)
[](https://twitter.com/intent/follow?screen_name=iris_framework)
[](https://www.facebook.com/iris.framework)
您可以立即[获取](https://www.iris-go.com/#ebookDonateForm) **Iris 电子书**(新版)的 PDF 版本和在线访问权限,并参与到 Iris 的开发中。
## 🙌 贡献
我们欢迎您为 Iris 框架做出贡献!想要知道如何为 Iris 项目做贡献,请查看 [CONTRIBUTING.md](CONTRIBUTING.md)。
[贡献者名单](https://github.com/kataras/iris/graphs/contributors)
## 🛡 安全漏洞
如果您在 Iris 中发现安全漏洞,请发送电子邮件至 [iris-go@outlook.com](mailto:iris-go@outlook.com)。所有安全漏洞将会得到及时解决。
## 📝 开源协议(License)
就像 Go 语言本身一样,此项目也采用 [BSD 3-clause license](LICENSE)。
项目名称 "Iris" 的灵感来自于希腊神话。