20179


GoのアプリケーションにMartiniというフレームワークを使っています。  
そこで質問です。  
MartiniでJsonをストリーミングするにはどのようにすればよいのでしょうか。  
私は2通りの方法でやってみましたがどちらも1つのレスポンスになってしまいます。

**方法1**

MartiniのJsonレンダリングのためのミドルウェアRender(<https://github.com/martini-
contrib/render>) を使った方法

[code]

    func Handler(r render.Render){  
    
        /*抜粋*/
        for _,v := range data{
            r.JSON(200, v)  
            time.Sleep(2*time.Second)  
        }
    }
    
[/code]

**方法2**  
ResponseWriterを使った方法

[code]

    func Handler(res http.ResponseWriter){
    
        /*抜粋*/
        for _, v := range data{
            d, _ := json.Marshal(v)
            res.Write(d)
            res.(http.Flusher).Flush()
            time.Sleep(2*time.Second)
        }
    }
    
[/code]

どのようにすればストリーミングを実現できるのでしょうか


CC BY-SA 3.0
2015-12-19T09:26:22.280
20176
2015-12-19T13:29:04.680
7232
question
go streaming
GoのWAF、MartiniでJsonをストリーミングしたい


`http.Hijacker`を使ってTCPソケットに直接書き込めばストリーミングできると思います。

[code]

    package main
    
    import (
        "encoding/json"
        "net/http"
        "time"
    
        "github.com/go-martini/martini"
    )
    
    func main() {
        m := martini.Classic()
        m.Get("/", Handler)
        m.Run()
    }
    
    func Handler(w http.ResponseWriter) {
        hj, _ := w.(http.Hijacker)
        conn, bufrw, _ := hj.Hijack()
        defer conn.Close()
    
        bufrw.WriteString("HTTP/1.1 200 OK\r\n")
        bufrw.WriteString("Content-Type: application/json\r\n")
        bufrw.WriteString("Cache-Control: no-cache\r\n")
        bufrw.WriteString("\r\n")
        bufrw.Flush()
    
        enc := json.NewEncoder(bufrw)
    
        for i := 0; i < 10; i++ {
            data := map[string]interface{}{"message": "hi!", "id": i}
            enc.Encode(data)
            bufrw.Flush()
            time.Sleep(time.Second * 2)
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-19T13:21:57.483
20179
2015-12-19T13:29:04.680
2015-12-19T13:29:04.680
3639
3639
20176
answer