You are viewing an old version of this page. View the current version.
Compare with Current View Page History
Version 10 Current »
我们可以很简单实现HTTP流式数据返回。
v2.4
如果当前使用的框架版本小于v2.4正式版(不是beta版本),使用以下方式返回(标准库原生写法)。
beta
package main import ( "fmt" "net/http" "time" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.BindHandler("/", func(r *ghttp.Request) { rw := r.Response.RawWriter() flusher, ok := rw.(http.Flusher) if !ok { http.Error(rw, "Streaming unsupported!", http.StatusInternalServerError) return } r.Response.Header().Set("Content-Type", "text/event-stream") r.Response.Header().Set("Cache-Control", "no-cache") r.Response.Header().Set("Connection", "keep-alive") for i := 0; i < 100; i++ { _, err := fmt.Fprintf(rw, "data: %d\n", i) if err != nil { panic(err) } flusher.Flush() time.Sleep(time.Millisecond * 200) } }) s.SetPort(8999) s.Run() }
由于以上操作有点繁琐,因此在该版本以后做了一些操作上的改进,如果当前使用的框架版本在v2.4正式版(不是beta版本)以上,那么可以使用以下方式快速实现流式数据返回。
package main import ( "time" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.BindHandler("/", func(r *ghttp.Request) { r.Response.Header().Set("Content-Type", "text/event-stream") r.Response.Header().Set("Cache-Control", "no-cache") r.Response.Header().Set("Connection", "keep-alive") for i := 0; i < 100; i++ { r.Response.Writefln("data: %d", i) r.Response.Flush() time.Sleep(time.Millisecond * 200) } }) s.SetPort(8999) s.Run() }
执行后访问 http://127.0.0.1:8999/ 可以看到数据通过流式方式不断地将数据返回给调用端。
Request
g.RequestFromCtx(ctx)
r.ExitAll()
Server-Sent Events 教程 - 阮一峰的网络日志 (ruanyifeng.com)