进阶 www.iris-go.com 2026-10-20 02:39:14 · 13 阅读
第27章 Iris 框架实战:处理 Gzip 压缩请求
Gzip 请求
学习如何在 Iris 中处理 Gzip 压缩请求。
基础 Gzip 处理
```gopackage main
import (
"compress/gzip"
"io"
"github.com/kataras/iris/v12"
)
func main() {
app := iris.New()
app.Post("/gzip", func(ctx iris.Context) {
if ctx.GetHeader("Content-Encoding") != "gzip" {
ctx.StopWithStatus(iris.StatusBadRequest)
return
}
reader, err := gzip.NewReader(ctx.Request().Body)
if err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
defer reader.Close()
data, err := io.ReadAll(reader)
if err != nil {
ctx.StopWithError(iris.StatusInternalServerError, err)
return
}
ctx.JSON(iris.Map{
"decompressed_size": len(data),
"content": string(data),
})
})
app.Listen(":8080")
}
```
JSON 与 Gzip
```go
type Message struct {
Text string `json:"text"`
Time int64 `json:"time"`
}
app.Post("/json-gzip", func(ctx iris.Context) {
if ctx.GetHeader("Content-Encoding") != "gzip" {
ctx.StopWithStatus(iris.StatusBadRequest)
return
}
reader, err := gzip.NewReader(ctx.Request().Body)
if err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
defer reader.Close()
var msg Message
if err := json.NewDecoder(reader).Decode(&msg); err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
ctx.JSON(iris.Map{
"received": msg,
})
})
```
使用 Gzip 处理大文件上传
goapp.Post("/upload-gzip", iris.LimitRequestBodySize(32<<20), func(ctx iris.Context) {
if ctx.GetHeader("Content-Encoding") != "gzip" {
ctx.StopWithStatus(iris.StatusBadRequest)
return
}
reader, err := gzip.NewReader(ctx.Request().Body)
if err != nil {
ctx.StopWithError(iris.StatusBadRequest, err)
return
}
defer reader.Close()
// 创建临时文件
tempFile, err := os.CreateTemp("", "upload-*.dat")
if err != nil {
ctx.StopWithError(iris.StatusInternalServerError, err)
return
}
defer tempFile.Close()
// 将解压数据写入文件
written, err := io.Copy(tempFile, reader)
if err != nil {
ctx.StopWithError(iris.StatusInternalServerError, err)
return
}
ctx.JSON(iris.Map{
"decompressed_size": written,
"filename": tempFile.Name(),
})
})1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
最佳实践 验证:检查内容编码,验证压缩,设置大小限制,处理格式,监控用量 性能:使用合适缓冲区,处理大数据,监控内存,实现超时,清理资源 安全:验证输入,设置大小限制,检查内容,监控用量,处理错误 错误处理:处理压缩错误,验证内容,记录问题,文档化错误,测试边缘情况
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
最佳实践 验证:检查内容编码,验证压缩,设置大小限制,处理格式,监控用量 性能:使用合适缓冲区,处理大数据,监控内存,实现超时,清理资源 安全:验证输入,设置大小限制,检查内容,监控用量,处理错误 错误处理:处理压缩错误,验证内容,记录问题,文档化错误,测试边缘情况