2014-03-01 124 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

相关问题