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` 会关闭流?

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

如果顶层对象是数组,它将会被懒加载解析
by
谢谢,我明白了。

我仍然在努力读取 (不断更新的) 日志文件,并将每一行发送到通道。我似乎找不到一个显示如何操作的示例。
...