Http 如何获取ndjson响应流

Http 如何获取ndjson响应流,http,stream,nim-lang,ndjson,Http,Stream,Nim Lang,Ndjson,我正在尝试连接到http API。此API使用ndjson响应,这是一个换行符分隔的json字符串。我需要一行一行地使用这些代码,然后才能下载它们(事实上,甚至在服务器知道它将在未来的代码行中输出什么之前)。 在Python中,我可以通过以下方式实现这一点: import requests, json lines = requests.get("some url", stream=True).iter_lines() for line in lines: #pars

我正在尝试连接到http API。此API使用ndjson响应,这是一个换行符分隔的json字符串。我需要一行一行地使用这些代码,然后才能下载它们(事实上,甚至在服务器知道它将在未来的代码行中输出什么之前)。 在Python中,我可以通过以下方式实现这一点:

import requests, json

lines = requests.get("some url", stream=True).iter_lines()
for line in lines:
    #parse line as JSON and do whatever
它就像魅力一样

我希望在Nim中实现相同的效果,但程序会阻塞。例如,我尝试只加载响应的第一行:

import httpclient, json, streams

var stream = newHttpClient().get("some url").bodyStream
var firstLine = ""
discard stream.readLine(firstLine )
echo firstLine
但是没有运气——也就是说,这个节目永远不会回响。 我还尝试了
streams.lines
iterator,但也没有用


有没有类似于Python snipet的习惯用法可以让我轻松地逐行处理http响应流?

解决方案是使用@pietroppeter链接的问题中的
net
模块。这最初对我不起作用,因为我没有正确构造HTTP请求。 生成的代码:

import net, json

const HOST = "host"
const TOKEN = "token"

iterator getNdjsonStream(path: string): JsonNode =
    let s = newSocket()
    wrapSocket(newContext(), s)
    s.connect(HOST, Port(443))
    var req = &"GET {path} HTTP/1.1\r\nHost:{HOST}\r\nAuthorization: {TOKEN}\r\n\r\n"
    s.send(req)
    while true:
        var line = ""
        while line == "" or line[0] != '{':            
            line = s.recvLine
        yield line.parseJson
我认为使用
httpClient
模块无法实现这一点。异步版本看起来似乎可以做到这一点,但在我看来,只有在将来完成后,也就是在下载所有数据之后,才能处理接收到的数据。
这么简单的想法无法简单地完成,而且我找不到例子,这导致了几天的挫折感,以及在10年的编程之后开设stackoverflow帐户的需要。

这个论坛帖子似乎与您的问题有关:@pietroppeter谢谢。我觉得这是应该添加到httpclient模块中的东西,如果已经不可能完成这些事情的话……在遇到该线程之前,我最好的猜测是尝试使用AsyncHttpClient,它的异步响应具有bodyStream,这是一个FutureStream[string](您还需要使用AsyncStream)。我想可以用它构建一个迭代器行,但我不确定它是否可行。如果论坛帖子帮你找到一个解决方案,考虑加入你自己的答案这个问题(由SO鼓励)@ PieloppPeTealPosits不幸的是没有帮助我,用这种方法,我只有在完全准备好的时候才能够得到答案,而不是马上。我试图研究你的建议,但我不知道AsyncHttpClient在这方面能帮我什么忙。你能详细说明一下吗?这个想法可能是AsyncResponse的bodyStream字段是一个FutureStream,它可能在完整响应准备好之前包含数据(你需要api从中访问内容),但我对异步内容不是很在行,所以这只是一个猜测,可能没有什么用处。而且,我不知道如何测试这些东西也无济于事。