第25章 二进制请求
二进制请求
学习如何在 Iris 中处理二进制请求体。
基础二进制处理
gopackage main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New()
app.Post("/binary", func(ctx iris.Context) {
data := ctx.GetBody()
ctx.JSON(iris.Map{
"size": len(data),
"received": true,
})
})
app.Listen(":8080")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
带大小限制的二进制上传
goapp.Post("/upload", iris.LimitRequestBodySize(32<<20), func(ctx iris.Context) {
data := ctx.GetBody()
// 处理二进制数据
hash := sha256.Sum256(data)
ctx.JSON(iris.Map{
"size": len(data),
"hash": fmt.Sprintf("%x", hash),
})
})
1
2
3
4
5
6
7
8
9
10
11
流式处理二进制数据
goapp.Post("/stream", func(ctx iris.Context) {
reader := ctx.Request().Body
buffer := make([]byte, 1024)
content := []byte{}
for {
n, err := reader.Read(buffer)
if err != nil && err != io.EOF {
ctx.StopWithError(iris.StatusInternalServerError, err)
return
}
if n == 0 {
break
}
content = append(content, buffer[:n]...)
}
ctx.JSON(iris.Map{
"size": len(content),
"received": true,
})
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
最佳实践
- 校验:检查内容类型、验证大小、处理格式、设置限制、监控使用情况
- 安全:验证输入、设置大小限制、扫描内容、监控使用、处理错误
- 性能:使用合适的缓冲区、处理大数据、监控内存、实现超时、清理资源
- 错误处理:处理 IO 错误、验证内容、记录问题、文档化错误、测试边缘情况