我正在尝试连接到执行json数据的HTTP流式传输的端点。 我想知道如何使用Go的net / http包执行基本请求并读取传入的响应。目前,我只能在连接关闭时读取响应。

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

任何见解将不胜感激!

谢谢!

-RC

  • 您看到这个答案了吗?
  • 该代码将在流上运行。 如果您没有按预期得到它,那是因为服务器如何发送它。 Ive使用此模型解析了许多GB的响应。

Eve Freeman提供的答案是读取json数据的正确方法。 要读取任何类型的数据,可以使用以下方法:

1
2
3
4
5
6
7
8
9
10
11
resp, err := http.Get("http://localhost:3000/stream")
...

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

    log.Println(string(line))
}
  • 但是如何检测该[]字节上的EOF?
  • EOF返回err
  • 现在使用这些块/行如何直接将其写入文件。 表示如何使用不完整的流作为文件写入。?

流式JSON解析的方法是使用Decoder:

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

对于其中有很多对象返回的流API(例如Twitter),应该使用此模型和内置的encoding / json API进行流式处理。 但是,如果响应很大,而您的对象中有一个包含10MB内存的巨大数组,则可能需要编写自己的Decoder才能将这些内部片段取出并返回。 我用我编写的库遇到了这个问题。

  • 感谢您的回答! 我设法通过创建bufio.Reader并在resp.Body上调用ReadBytes()使其工作。
  • 前夕,哪里有关于最大10MB的文档? 我需要信息
  • 它不是最大值,而是解析器工作的方式,一次只能对象。
  • 写完响应后,有没有办法听?