2014-03-01 35 views
12

我正在嘗試連接到執行JSON數據的http流式傳輸的端點。我想知道如何使用Go的net/http包執行基本請求,並在響應進入時讀取它。目前,我只能在連接關閉時讀取響應。如何使用Golang的net/http包讀取流式響應主體?

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

任何有識之士將不勝感激!

謝謝!

-RC中

+0

你看到[這個答案](http://stackoverflow.com/questions/19292113/not-buffered-http-responsewritter-in- golang),它有幫助嗎? –

+0

該代碼將在一個流上運行。如果你沒有得到它,那是因爲服務器如何發送它。我用這個模型解析了許多GB的響應。 – Dustin

回答

10

做流JSON解析的方法是使用解碼器:

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

對於流API,其中它的對象回來(一拉Twitter)上一堆,這應該流與這個模型和內置的編碼/ json API很好。但是,如果您的對象具有10MB內存的大型陣列,那麼您可能需要編寫自己的解碼器來將這些內部碎片拉出並返回。我遇到了一個我寫過的圖書館的問題。

+0

感謝您的回答!我設法通過創建一個bufio.Reader並在resp.Body上調用ReadBytes()來實現它。 – chourobin

+0

Eve,最大10MB的文檔?我需要的信息 – KingRider

+0

這不是最大值,它只是解析器工作的方式,一次只能有一個對象。 –

23

Wes 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)) 
} 
+0

但是,如何檢測EOF []字節? – jsgoecke

+2

EOF與err一起返回 – ciscogambo

相關問題