2024年度Clojure调查中分享你的想法!

欢迎!有关如何使用本站的更多信息,请参阅关于页面。

0
IO

我正在尝试读取一个json 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`来消费日志文件,但文件连接在某个时刻总是关闭。

编辑:
`with-open`将在(doseq)体完成之后关闭流。每次您将不得不重新运行`read-gh-stream`。
如果`lines`是懒加载的,我预计`doseq`会持续处理流,尽管`parse-stream`文档说

如果顶层对象是数组,它将以懒加载方式解析
谢谢,我理解了。

我在读取(持续更新的)日志文件同时将每行发送到通道时有困难。我似乎找不到一个显示如何执行此操作的示例。
...