2017-06-29 4 views
0

golangでgin-gonicサーバーを使用して1つのストリーミング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つのイベントすべてで。 私が望むのは、1秒ごとにイベントを受信し始めるシステムを呼び出すことです。レスポンスは、受信側へのストリーミングAPIのように見えるはずです。 今回は問題文で私が明確になることを願っています。 – kunalag

関連する問題