首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取ndjson响应流

如何获取ndjson响应流
EN

Stack Overflow用户
提问于 2020-11-10 18:02:53
回答 1查看 398关注 0票数 2

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

代码语言:javascript
复制
import requests, json

lines = requests.get("some url", stream=True).iter_lines()
for line in lines:
    #parse line as JSON and do whatever

它的效果就像魅力一样。

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

代码语言:javascript
复制
import httpclient, json, streams

var stream = newHttpClient().get("some url").bodyStream
var firstLine = ""
discard stream.readLine(firstLine )
echo firstLine

但如果没有运气--也就是说,程序永远不会回放。我也尝试过streams.lines迭代器,但也没有用。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-15 18:56:29

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

代码语言:javascript
复制
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帐户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64766727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档