请在2024年Clojure调查问卷中分享您的看法!

欢迎!请参阅关于页面获取有关此功能的更多信息。

0
IO

我正在尝试读取一个HTTP流中的json,并无限地使用其中的元素。

我想出了下面的代码,但它会关闭流,并且只返回30个结果 - 如何无限地使用HTTP流呢?

谢谢您的帮助!

(ns core
  (:require [clj-http.client :as http]
            [cheshire.core :as json]
            [clojure.java.io :as io]
            [clojure.core.async :as async]))

(def gh-url "https://api.github.com/events")
(def chan (async/chan 100))

(async/go
  (loop [r (async/<! chan)]
    (when (not-empty r) (println (:type r)))
    (recur (async/<! chan))))

(defn read-gh-stream [url]
  (with-open [stream (-> url (http/get {:as :stream}) :body)]
    (let [lines (-> stream io/reader (json/parse-stream true))]
      (doseq [l lines]
        (async/go
          (async/>! chan l))))))

1 个答案

+1

GitHub API每次http调用只会返回30个事件,它不会随着事件发生而持续向您发送事件。如果您想获取下一个30个事件,您必须向GitHub API发出另一个请求。请参阅以下文档:https://developer.github.com/v3/activity/events/

感谢您的回复!我将尝试使用Twitter持久HTTP流。

我写的代码可以正确运行吗?或者`do-seq`会关闭流吗?

备注:我也在尝试通过流式传输将其传输到`core.async`来消费日志文件,但与文件的连接总是在某个时候关闭。
by
编辑了 by
`with-open`将在(doseq)主体完成后关闭流。您必须每次都重新运行`read-gh-stream`。
by
如果`lines`是懒的,我期望`doseq`会继续处理流,尽管`parse-stream`文档中说

如果顶层对象是一个数组,它将按需解析
by
谢谢,我明白了。

我仍在努力(始终更新的)日志文件,并将每行新内容发送到通道。我似乎找不到一个示例来展示如何做到这一点。
...