进阶 www.iris-go.com 2026-10-20 02:39:14 · 16 阅读
第2章 HTTP 压缩
压缩
HTTP 压缩,也叫内容编码(content encoding),是一种公开定义的标准,用于压缩从 Web 服务器传输到浏览器的文本内容。它使用 gzip、brotli 等公共领域的压缩算法,在服务器端对 HTML、JavaScript、CSS 及其他文本文件进行压缩。这种基于标准的压缩内容传输方式内置于 HTTP 1.1 中,绝大多数支持 HTTP 1.1 的现代浏览器都能对压缩文档做 ZLIB 解压。也就是说,浏览器可以自动解压压缩文件,从而节省时间和带宽。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Compression
在 Iris 中,只需一行代码即可启用内置的最佳压缩方案:
app.Use(iris.Compression)
iris.Compression 是一个中间件,它让服务器能够向客户端写入压缩数据,也能读取客户端发来的压缩数据。
要对服务器的所有响应和请求都启用压缩:
func main() {
app := iris.New()
app.Use(iris.Compression)
app.Post("/data", handler)
}
func handler(ctx iris.Context) {
response := iris.Map{"name", "kataras"}
ctx.JSON(response)
}
如果只想启用写入压缩数据而不读取,可以不用 iris.Compression,单独调用 ctx.CompressWriter(true),反之亦然。
func handler(ctx iris.Context) {
ctx.CompressWriter(true)
// [...]
}
此外还有 Context.ClientSupportsEncoding(s ...string) bool 方法,用于判断客户端是否接受并支持 gzip 编码:
func handler(ctx iris.Context) {
if ctx.ClientSupportsEncoding("gzip") {
// 客户端期望并支持 gzip 响应。
} else {
// 客户端不支持 gzip。
}
}
这就够了;你的处理器会自动发送和/或接收压缩数据,无需执行其他操作。
问答
Iris 在写入时如何选择压缩算法?Iris 读取请求的 Accept-Encoding 头值,如果包含多个压缩算法,它会协商出最佳候选项,并使用所选算法压缩数据。默认情况下,浏览器接受 gzip。
Iris 如何为请求主体选择解压算法?基于请求的 Content-Encoding 头值。
内置的压缩算法有哪些?"gzip"、"deflate"、"br"、"brotli"、"snappy"。
我如何查看用于写入和读取的选定算法?你必须导入 "github.com/kataras/iris/v12/context" 包来访问 Iris 的写入器和读取器类型。
```go
func handler(ctx iris.Context) {
if cw, ok := ctx.ResponseWriter().(*context.ResponseCompressWriter); ok {
alg := cw.Encoding
// [...]
}
if cr, ok := ctx.Request().Body.(*context.CompressReader); ok {
alg := cr.Encoding
// [...]
}
}
```
12
3
4
5
6
7
8
9
10
11