1

我正在尝试使用 Clojure 和 clj-http 库检索网站。我想从一个简单的例子开始慢慢来:

(:body (client/get (str "http://www.google.com") {:as :clojure}))

据我了解图书馆的行为,这个调用应该返回网站的主体,但它返回的只是<!doctype.

当我尝试打电话时

(:body (client/get (str "http://www.google.com") {:as :json}))

我什至得到一个例外:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60))

我无法想象图书馆会被破坏,但我也无法在我的通话中看到明显的错误。你们中有人经历过这种行为吗?

4

2 回答 2

1

要将 http 响应正文作为字符串获取,您可以使用以下命令:

(:body (client/get "http://www.google.com"))

选项中的:as条目{:as :clojure}output-coercion,并试图将来自 google.com 的 HTML 正文转换为 Clojure 数据结构。除非响应正文实际上包含 Clojure 代码,否则这将失败。

如果您尝试解析 HTML 响应,则可能需要查看其他库,例如Enlive

于 2013-10-22T19:19:00.387 回答
0

问题是您查询的 URL 没有返回您将结果强制转换为的数据类型。

例如,如果您尝试使用http://ip.jsontest.com/返回正确 json 的此 url:

 (require '[clj-http.client :as client])
 (client/get "http://ip.jsontest.com/" {:as :json})
 => {:trace-redirects ["http://ip.jsontest.com/"], :request-time 1153, 
     :status 200, 
     :headers {"access-control-allow-origin" "*", "content-type" "application/json; charset=ISO-8859-1", "date" "Tue, 22 Oct 2013 19:50:36 GMT", "server" "Google Frontend", "cache-control" "private", "alternate-protocol" "80:quic,80:quic", "connection" "close"}, :body {:ip "186.54.233.167"}}

响应被正确解析。

检查响应body,您可以很容易地看到json确实存在:

(:body (client/get "http://ip.jsontest.com/"))
=> "{\"ip\": \"186.54.233.167\"}\n"
于 2013-10-22T19:53:50.167 回答