2017-06-29 29 views
0

我想在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) 

但是,当我试图击中端点时,它只是发现并没有响应。 有人使用了流功能,以便他/她可以指出我可能正在做的错误。谢谢!

+0

找出问题所在。在SSEvent之后,返回true将使流函数继续运行,通过通道完成后,需要在流关闭后返回false。 – kunalag

+0

但现在的问题是,直到时间流功能运行,调用者不会获得任何流数据,它只有在c.Stream函数完成后才会获取。 – kunalag

回答

0

如果流结束,您应该返回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() 
} 
+0

非常感谢。已经想通了(问题在下面的评论) 但是现在我面临着一个不同的问题,直到时间流功能运行,调用者不会获得任何流数据,它只有在c.Stream函数完成后才会获取。如果你可以帮助我,那将会很棒。 – kunalag

+0

您的意思是说,从chan读取的数据可能会在响应超时后出现。 – mattn

+0

在当前实现中,命中“/ stream”的系统在5秒后接收数据。所有5个事件一次性完成。 我想要的是调用系统应该在每秒钟后开始接收事件,响应应该看起来像一个流API到接收器。 我希望这一次我对问题陈述很清楚。 – kunalag

相关问题