我正在尝试连接到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响应流?
解决方案是使用net
@pietroppeter链接的问题中的模块。最初这对我不起作用,因为我没有正确构造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帐户。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句