gin 的 ctx.Stream 为啥要等方法执行完后才一次性输出结果?
gin 的ctx.Stream 为啥不起作用,也就是说必须要等控制器方法执行完成后,ctx.Stream
输出才会一次性的依次性输出?
回复
1个回答

test
2024-06-20
在 gin 启用了压缩输出中间件时,ctx.Stream
不起作用,参见:
r := gin.New()
r.Use(brotli.Brotli(brotli.DefaultCompression))
在这种情况下,其实前端请求的时候,在 Header
中带上 Content-Type: text/event-stream
即可。
参见 gin
的 gin_brotli.go
中的方法:
func shouldCompress(req *http.Request, options *Options) bool {
if !strings.Contains(req.Header.Get("Accept-Encoding"), "br") ||
strings.Contains(req.Header.Get("Connection"), "Upgrade") ||
strings.Contains(req.Header.Get("Content-Type"), "text/event-stream") {
return false
}
extension := filepath.Ext(req.URL.Path)
if len(extension) < 4 { // fast path
return true
}
if skip := containsString(options.SkipExtensions, extension); skip {
return false
} else {
return true
}
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容