【问题标题】:How to get a stream of a ndjson response如何获取 ndjson 响应流
【发布时间】:2020-11-10 10:02:52
【问题描述】:

我正在尝试连接到 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 响应流?

【问题讨论】:

  • 此论坛主题似乎与您的问题有关:forum.nim-lang.org/t/6103
  • @pietroppeter 谢谢。我觉得这是应该添加到 httpclient 模块的东西,如果已经不可能做这些事情的话......
  • 在碰到那个线程之前,我最好的猜测是尝试使用 AsyncHttpClient,它的 AsyncResponse 有 bodyStream,它是一个 FutureStream[string](你还需要使用 AsyncStream)。我想可以从中构建一个迭代器行,但我不确定它是否可行。如果论坛帖子有助于为您的案例找到解决方案,请考虑为这个问题添加您自己的答案(受 SO 鼓励:stackoverflow.com/help/self-answer
  • @pietroppeter 不幸的是,论坛帖子对我没有帮助,使用这种方法,我只能在完整的响应准备好时才能得到线路,而不是马上。我试图调查您的建议,但我看不到 AsyncHttpClient 在这里可以如何帮助我。你能详细说明一下吗?
  • 这个想法可能是 AsyncResponse 的 bodyStream 字段是 FutureStream 可能在完整响应准备好之前包含数据(您需要来自 nim-lang.org/docs/asyncstreams.html 的 api 来访问内容),但我是在异步的东西上不是很能干,所以这只是一个疯狂的猜测,可能没有用。我不知道如何测试东西也无济于事。

标签: http stream nim-lang ndjson


【解决方案1】:

解决方案是使用@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 帐户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2012-08-10
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2018-07-02
    • 2021-05-13
    相关资源
    最近更新 更多