gin 的 ctx.Stream 为啥要等方法执行完后才一次性输出结果?

作者站长头像
站长
· 阅读数 21

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

回复
1个回答
avatar
test
2024-06-20

在 gin 启用了压缩输出中间件时,ctx.Stream 不起作用,参见:

r := gin.New()
r.Use(brotli.Brotli(brotli.DefaultCompression))

在这种情况下,其实前端请求的时候,在 Header 中带上 Content-Type: text/event-stream 即可。

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