1
0
mirror of https://github.com/kataras/iris.git synced 2026-07-31 08:29:50 +00:00
Files
kararas_iris/README_ZH_HANS.md
T
2026-07-27 11:40:16 +03:00

99 KiB
Raw Blame History

新闻

🚀 Iris v14 即将到来。 下一个大版本是本项目历史上最大的一次发布:基于 Go 泛型重建的框架、由编译器检查的应用构建器、替你完成校验的请求辅助函数、统一的错误映射表、三十个内置中间件,以及随仓库一同发布的一本书。详情见下方的 Iris v14 带来了什么

这里介绍的 v12 仍然可用,也仍在持续修复。v14 使用新的 import 路径,所以它发布的那天,你这边不会有任何东西被破坏。

Iris Web Framework English العربية

build status view examples chat donate

Iris 是基于 Go 编写的一个快速、简单但功能齐全且非常高效的 Web 框架。

它为您的下一个网站或 API 提供了非常富有表现力且易于使用的基础。

🌟 看看其他人如何评价 Iris,同时欢迎为此开源项目点亮 star

Benchmarks: Jul 18, 2020 at 10:46am (UTC)

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 <strong>%s</strong>!", "World")
  })

  app.Listen(":8080")
}

正如一位 Go 开发者所说,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 分组连接起来。步骤顺序由编译器强制,所以应用要么正确构建,要么根本编译不过。

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。响应辅助函数写出成功状态码,或者写出你的中央映射表为该错误指定的响应。

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.OKrest.NoContentrest.Countrest.Paginated 覆盖了 API 返回的其余形态。

错误只声明一次

新的 rest/errors 包保存着从你的领域错误到 HTTP 响应的映射。客户端拿到规范的、机器可读的响应体。内部信息留在内部。注册一个 collector,每一次失败都会从同一个地方进入你的日志或数据库。错误可以渲染为 JSON,也可以渲染为视图,取决于客户端想要什么。

依赖注入无处不在,不再只属于 MVC

构造函数声明自己需要什么,容器负责提供:处理函数、API 分组、控制器都一样。实现了 Init(ctx context.Context) error 的服务会在 Build() 内部执行一次。可关闭的资源会在关停时关闭。hero 包不再存在,取而代之的是 deprest,用更少的代码做更多的事。MVC 控制器建立在泛型之上。

包都在你以为它们该在的地方

sessionscachewebsocketi18nviewversioning 都成了中间件。mvc 移到了 controller 之下,与新的 fileserversitemapapigraph 控制器并列。apigraph 会把你的路由树画成一张可交互的 D3 图。

框架内置三十个中间件,其中包括这些新成员:httpcost(每个请求的时间、内存和 CPU,用于性能分析或计费)、bodylimitcompresscounterreferrergeolocationipaccessservertiming。视图引擎的实现迁移到了 iris-contrib/views

配置是一个部分字面量

iris.Configuration 和那些 With* 配置器由 iris.Options 取代。只写你关心的字段,其余的来自默认值。Bind 先从 SERVER_CONFIG 环境变量读取 YAML,然后再从文件读取。

app := iris.New(iris.Options{Name: "myapp", LogLevel: "debug"})

名字如实说明它在做什么

读请求头和设置响应头不再共用一个会悄悄改变含义的前缀:ctx.Header 读取请求,而 ctx.SetHeaderctx.ResponseHeader 作用于响应。Party 现在叫 Routerctx.URLParam 现在是 ctx.Query().Get。每一处重命名都连同替代写法列在迁移指南里,其中大多数只需一次查找替换。

默认就是安全的

会话 cookie 默认带上 SecureSameSite=Lax。请求体大小限制在所有读取路径上都会生效。重建的过程中也顺手解决了一批老问题,其中包括一个只记录限制却从不真正执行的限流器,以及一次可能把整个进程带走的 Logout 调用。

可以从头读到尾的文档

v14 附带一本收录在仓库里的 23 章图书、一份用单篇文档写出带测试的 REST API 的入门教程、一份面向 v12 应用的迁移指南,以及一个由源码生成、可以回答代码库问题的实时 AI wiki。

这对你的 v12 代码意味着什么

import 路径变为 github.com/kataras/iris/v14,因此 v12 和 v14 可以并存,发布当天不会有任何东西被破坏。什么时候升级由你决定。迁移指南覆盖 import 路径、包的移动、每一个被移除的 API 及其替代品,以及行为上的变化,机械的部分还给出了可直接执行的命令。

目前还没有公开的发布日期。关注 releases 或者 @iris_framework,第一时间收到消息。

👑 赞助者

有了你们的帮助,我们可以让开源 Web 开发对所有人都更好!

getsentry github lensesio thepunterbot h4rdc0m draFWM gf3 trading-peter AlbinoGeek basilarchia sumjoe simpleittools xiaozhuai Remydeme celsosz linxcoder jnelle TechMaster janwebdev altafino jakoubek alekperos day0ng hengestone thomasfr code-chimp CetinBasoz International Juanses SometimesMage ansrivas boreevyuri brentwilson camilbinas ekobayong lexrus li3p madhu72 mosorize se77en tstangenberg vincent-li DavidShaw sascha11110 clichi2002 derReineke Sirisap22 primadi agoncecelia chrisliang12 zyu hobysmith pluja antonio-pedrazzini clacroix njeff3 ixalender mubariz-ahmed Cesar th31nitiate stgrosshh Didainius DmarshalTU IwateKyle Little-YangYang Major2828 MatejLach amritpal042 andrefiorot boomhut cshum dtrifonov gadokrisztian geordee guanting112 iantuan ichenhe rodrigoghm icibiri jewe11er jfloresremar jingtianfeng kilarusravankumar leandrobraga lfbos lpintes macropas marcmmx mark2b miguel-devs mihado mmckeen75 narven odas0r olaf-lexemo pitexplore pr123 rsousacode sankethpb wixregiga GeorgeFourikis saz59 shadowfiga siriushaha skurtz97 srinivasganti syrm tuhao1020 BlackHole1 L-M-Sherlock claudemuller keymanye wahyuief xuyan2018 xvalen xytis ElNovi IpastorSan KKP4 Lernakow ernestocolombo francisstephan pixelheresy rcapraro soiestad spkarason thanasolykos ukitzmann DanielKirkwood colinf simonproctor FernandoLangOFC Firdavs9512 Flammable-Duck Gepetdo Hongjian0619 JoeD Jude-X Kartoffelbot KevinZhouRafael KrishManohar Laotanling Longf99999 Lyansun MihaiPopescu1985 TBNilles ajanicij aprinslo1 Mohammed8960 NA Neulhan kyoukhana spazzymoto victorgrey ArishSultan ehayun kukaki oshirokazuhide t6tg 15189573255 AGPDev AnatolyUA AwsIT NguyenPhuoc Oka00 PaddyFrenchman RainerGevers Ramblestsad SamuelNeves Scorpio69t Serissa4000 TianJIANG Ubun1 WangYajun39 XinYoungCN YukinaMochizuki a112121788 acdias aeonsthorn agent3bood ajb-neodynamics-io alessandromarotta algobot76 algoflows angelaahhu anhxuanpham annieruci antoniejiao artman328 b2cbd baoch254 bastengao beytullahakyuz bjoroen blackHoleNgc1277 bunnycodego carlos-enginner centratelemedia chrismalek civicwar cnzhangquan cuong48d damiensy danlanxiaohei dextercai dfaugusto dkzhang dloprodu donam-givita dph0899 dvitale ec0629 edwindna2 ekiyooka ekofedriyanto eli-yip eljefedelrodeodeljefe fenriz07 ffelipelimao frenchmajesty gastropulgite geGao123 globalflea gloudx gnosthi gogoswift goten002 guanzi008 hdezoscar93 hieungm hieunmg homerious hzxd inyellowbus iuliancarnaru iysaleh jackptoke jackysywk jeff2go jeremiahyan joelywz kamolcu kana99 edsongley katsubushiken kattaprasanth keeio keval6706 khasanovrs kkdaypenny knavels kohakuhubo korowiov kostasvk lafayetteDan lbsubash leki75 lemuelroberto liheyuan lingyingtan linuxluigi lipatti maikelcoke marek-kuticka marman-hp mattbowen maxgozou maxgozzz mitas mizzlespot mkell43 mnievesco mo3lyana motogo mtrense mukunhao mulyawansentosa nasoma ngseiyu nikharsaxena nronzel odelanno onlysumitg xPoppa yesudeep ymonk yonson2 yshengliao ytxmobile98 yusong-offx zhenggangpku zou8944 SergeShin - BelmonduS Diewald cty4ka martinjanda evan hazmi-e205 jtgoral ky2s lauweliam ozfive paulcockrell paulxu21 pesquive petros9282 phil535 pitt134 poscard qiepeipei qiuzhanghua rapita rbondi relaera remopavithran rfunix rhernandez-itemsoft rikoriswandha risallaw robivictor rubiagatra rubyangxg rxrw saleebm sbenimeli sebyno seun-otosho shobhitsinghal77 solohiroshi su1gen sukiejosh suresh16671 svirmi terjelafton thiennguyen93 unixedia vadgun valsorym vguhesan vpiduri vrocadev vuhoanglam walter-wang martinlindhe mdamschen letmestudy michaelsmanley Curtman SridarDhandapani madrigaltenor opusmagna ShahramMebashar b4zz4r bobmcallan fangli galois-tnp mblandr midhubalan netbaalzovf oliverjosefzimmer peacememories talebisinan valkuere lfaynman ArturWierzbicki aaxx crashCoder derekslenk dochoaj evillgenius75 gog200921 mauricedcastro mwiater sj671 statik supersherm5 thejones CSRaghunandan ndimorle rosales-stephanie shyyawn vcruzato wangbl11 wofka72 geoshan juanxme nguyentamvinhlong yoru74 xsokev oleang michalsz pomland-94 tejzpr theantichris tuxaanand raphael-brand willypuzzle dmcbane malcolm-white-dti HieuLsw carlosmoran092 yangxianglong

📖 开始学习 Iris

安装

唯一的要求是 Go 编程语言

创建新项目

$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest # 或 @v12.2.11
在已有项目中安装
$ cd myapp
$ go get github.com/kataras/iris/v12@latest

运行

$ go mod tidy -compat=1.23 # windows 下用 -compat="1.23"。
$ go run .

Iris 有完整且详尽的 使用文档,让您可以轻松地上手此框架。

要了解更详细的技术文档,请访问我们的 godocs。如果想要寻找可运行的示例代码,可以到仓库的 ./_examples 子目录下获取。

用 Plexon AI 开发

Plexon AI 是 Hellenic Development 推出的跨平台 AI 编程助手,它内置了一个专门的 Iris 技能(skill:一份由框架作者亲自撰写的 v14 开发指南,包含十九篇参考文档,覆盖路由与宏、context API、rest 辅助函数、错误处理、全部三十个中间件、内置控制器、认证 SDK、安全加固、数据持久化、缓存、i18n、可观测性、性能、测试、部署,以及从 v12 到 v14 的迁移。

安装 Software Developer 人格(persona),Iris 技能会随之而来,与它启用的一批工程类 agent 并列。这样一来,助手写出的 Iris 代码就是框架本该被使用的样子,而不是靠训练时见过的零碎印象去猜。

你喜欢在旅行时阅读吗?

Book cover

follow author on twitter

follow Iris web framework on twitter

follow Iris web framework on facebook

您可以立即获取 Iris 电子书(新版)的 PDF 版本和在线访问权限,并参与到 Iris 的开发中。

🙌 贡献

我们欢迎您为 Iris 框架做出贡献!想要知道如何为 Iris 项目做贡献,请查看 CONTRIBUTING.md

贡献者名单

🛡 安全漏洞

如果您在 Iris 中发现安全漏洞,请发送电子邮件至 iris-go@outlook.com。所有安全漏洞将会得到及时解决。

📝 开源协议(License

就像 Go 语言本身一样,此项目也采用 BSD 3-clause license

项目名称 "Iris" 的灵感来自于希腊神话。