如何获取 ClojureScript 中 fetch API 返回的 Response 对象的正文文本?

How to I get the body text of a Response object returned by the fetch API in ClojureScript?

我正在尝试使用 Github Gist API 来获取我所有 Gist 的列表,如下所示:

(ns epi.core)

(.then  (.fetch js/window "https://api.github.com/users/seisvelas/gists")
        (fn [data] (.log js/epi data)))

js/epi 只是 console.log 除了我正在使用的博客平台提供的 (epiphany.pub)。

当我从 curl 调用 API 时,它工作正常;然而,当在 cljs 中完成而不是给我响应的主体时,这给了我 [object Response]。有谁知道我怎样才能得到回复的正文?

似乎 .fetch returns 是一个 Response 对象,您需要从中获取正文的属性 bodyhttps://developer.mozilla.org/en-US/docs/Web/API/Response

类似于(.body data)

TL;DR

(-> (.fetch js/window "https://api.github.com/users/seisvelas/gists")
  (.then #(.json %))  ; Get JSON from the Response.body ReadableStream
  (.then #(.log js/epi %))

是我要写的


在 ClojureScript 中,JavaScript 调用如 data.body() 可以用

调用
(.body data)

和 JavaScript 属性 像 data.body

一样的访问
(.-body data)

其中一个应该适用于您的情况。然而,fetch API 如果你想 get JSON from the body 需要多一点,我假设你是基于端点做的。

如果您正在处理 promise 链,您可能还想考虑使用 ->(线程优先)以便它从上到下读取。

有关线程承诺链的更多信息,请参阅 this Gist

有一个名为 lamdaisland.fetch 的包装 js fetch API 的库。本库使用 transit 作为默认编码格式,因此在使用 github API.

时需要指定接受格式

此库包含 kitchen-async.promise 作为其依赖项,因此您可以在 ClojureScript 源代码中要求 kitchen-async.promise。

(ns fetch.demo.core
  (:require [kitchen-async.promise :as p]
            [lambdaisland.fetch :as fetch]))

(p/try
  (p/let [resp (fetch/get
                "https://api.github.com/users/seisvelas/gists"
                {:accept :json
                 :content-type :json})]
    (prn (:body resp)))
  (p/catch :default e
     ;; log your exception here
    (prn :error e)))