为什么 Gin 框架中 `ctx.Stream` 无法实时输出,而要等到方法执行完后才能输出?

为什么 gin 框架中 `ctx.stream` 无法实时输出,而要等到方法执行完后才能输出?

gin 的 ctx.stream 要等方法执行完后才输出的原因

在使用 gin 框架时,使用 ctx.stream 输出结果,需要等到控制器方法执行完成后一次性输出。这是因为 gin 的压缩输出中间件默认启用,而该中间件会影响 ctx.stream 的行为。

具体来说,当启用了压缩输出中间件时,gin 会根据请求的 accept-encoding 头部检查是否需要对响应进行压缩。如果需要压缩,则不会直接输出响应内容,而是缓冲响应内容,并在方法执行完成后进行压缩和输出。

此时,ctx.stream 不会起作用,因为它会立即尝试输出响应内容,而此时响应内容尚未生成。

要避免这种情况,有以下解决方案:

  • 禁用压缩输出中间件,通过如下代码:
r := gin.New()
r.Use(brotli.Brotli(brotli.DefaultCompression, false))
  • 在请求头中添加 content-type: text/event-stream,以指示前端服务器的响应类型为事件流。

此时,即使启用了压缩输出中间件,ctx.stream 也可以正常起作用,并实时输出响应内容。

以上就是为什么 Gin 框架中 `ctx.Stream` 无法实时输出,而要等到方法执行完后才能输出?的详细内容,更多请关注硕下网其它相关文章!