进阶 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 // [...] } } ``` 1
2
3
4
5
6
7
8
9
10
11

评论 (0)