破碎:使用clj-http.client的body元素

时间:2013-10-22 19:02:02

标签: clojure

我正在尝试使用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))

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

2 个答案:

答案 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"
相关问题