我正在尝试使用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))
我无法想象图书馆会被打破,但我也无法在通话中看到明显的错误。你有没有人经历过这种行为?
答案 0 :(得分:1)
要将http响应正文作为字符串获取,您可以使用以下内容:
(:body (client/get "http://www.google.com"))
:as
选项中的{:as :clojure}
条目为output-coercion,并且正在尝试将HTML正文从google.com转换为Clojure数据结构。除非响应主体实际包含Clojure代码,否则这将失败。
如果您尝试解析HTML响应,则可能需要查看其他库,例如Enlive。
答案 1 :(得分:0)
问题是您正在查询未返回您将结果强制转换为的数据类型的网址。
例如,如果您尝试使用http://ip.jsontest.com/
此url返回正确的json:
(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"