web-dev-qa-db-ja.com

Golangのnet / httpパッケージを使用してストリーミングレスポンスの本文を読み取るにはどうすればよいですか?

Jsonデータのhttpストリーミングを行うエンドポイントに接続しようとしています。 Goのnet/httpパッケージを使用して基本的なリクエストを実行し、応答を受信する方法を知りたいと思っていました。現在、接続を閉じたときにのみ応答を読み取ることができます。

resp, err := http.Get("localhost:8080/stream")
if err != nil {
    ...
}
...
// perform work while connected and getting data

どんな洞察もいただければ幸いです!

ありがとう!

-RC

18
chourobin

ストリーミングJSON解析を行う方法は、デコーダーを使用することです。

json.NewDecoder(resp.Body).Decode(&yourStuff)

戻ってくる一連のオブジェクトであるストリーミングAPI(Twitterなど)の場合、このモデルと組み込みのencoding/json APIを使用すると、ストリーミングがうまくいくはずです。しかし、10MBの巨大な配列を持つオブジェクトがある大きな応答である場合、おそらく独自のデコーダーを作成してそれらの内部のピースを引き出して返す必要があります。私が書いたライブラリでその問題に遭遇しています。

15
Eve Freeman

Eve Freemanが提供する答えは、jsonデータを読み取る正しい方法です。あらゆるタイプのデータを読み取るには、以下の方法を使用できます。

resp, err := http.Get("http://localhost:3000/stream")
...

reader := bufio.NewReader(resp.Body)
for {
    line, err := reader.ReadBytes('\n')
    ...

    log.Println(string(line))
}
37
chourobin