如何在golang中使用gin-gonic服务器编写流API?试过c.Stream没有工作
问题描述:
我想在golang中使用gin-gonic服务器创建一个流媒体API。如何在golang中使用gin-gonic服务器编写流API?试过c.Stream没有工作
func StreamData(c *gin.Context) {
chanStream := make(chan int, 10)
go func() {for i := 0; i < 5; i++ {
chanStream <- i
time.Sleep(time.Second * 1)
}}()
c.Stream(func(w io.Writer) bool {
c.SSEvent("message", <-chanStream)
return true
})
}
router.GET("/stream", controller.StreamData)
但是,当我试图击中端点时,它只是发现并没有响应。 有人使用了流功能,以便他/她可以指出我可能正在做的错误。谢谢!
答
如果流结束,您应该返回false。关闭陈。
package main
import (
"io"
"time"
"github.com/gin-gonic/gin"
"github.com/mattn/go-colorable"
)
func main() {
gin.DefaultWriter = colorable.NewColorableStderr()
r := gin.Default()
r.GET("/stream", func(c *gin.Context) {
chanStream := make(chan int, 10)
go func() {
defer close(chanStream)
for i := 0; i < 5; i++ {
chanStream <- i
time.Sleep(time.Second * 1)
}
}()
c.Stream(func(w io.Writer) bool {
if msg, ok := <-chanStream; ok {
c.SSEvent("message", msg)
return true
}
return false
})
})
r.Run()
}
找出问题所在。在SSEvent之后,返回true将使流函数继续运行,通过通道完成后,需要在流关闭后返回false。 – kunalag
但现在的问题是,直到时间流功能运行,调用者不会获得任何流数据,它只有在c.Stream函数完成后才会获取。 – kunalag