微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取ndjson响应流

如何解决如何获取ndjson响应流

我正在尝试连接到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迭代器,但这也无济于事。

是否有一些类似于Python片段的习惯用法,可以让我轻松地逐行处理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模块来实现。异步版本看起来像他们可以做到的,但是在我看来,只有在Future完成后(即在下载所有数据之后),您才能使用接收到的数据。 这样简单的想法不能简单地完成,而且我找不到示例,这会导致几天的挫败感,并且需要经过10年的编程才能开设一个stackoverflow帐户。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。