尝试使用clj-http在clojure中传递args时出错

时间:2014-02-23 22:53:15

标签: clojure

希望这对于那些经验丰富的人来说很简单。我正在使用clj-http并尝试传递命令行arg int it(以获取URL)。我是一个绝对的Clojure初学者,但我已经设法将args传递给了一个有效的ptintln。

(ns foo.core
  (:require [clj-http.client :as client]))

(defn -main
  [& args]
  (def url (str args))
  (println url)
  (def resp (client/get url))
  (def headers (:headers resp))
  (def server (headers "server"))
  (println server))

错误消息

Ants-MacBook-Pro:target ant$ lein run "http://www.bbc.com"
("http://www.bbc.com")
Exception in thread "main" java.net.MalformedURLException: no protocol: ("http://www.bbc.com")

这有效

(def resp (client/get "http://www.bbc.com"))

提前感谢。

1 个答案:

答案 0 :(得分:2)

args是一个列表,这意味着在其上调用str会返回列表的表示形式,并带有括号和内部引号,如错误跟踪中所示:

(println (str '("http://www.bbc.com")))
;; prints ("http://www.bbc.com")

当然,网址不是以括号和引号开头的,这就是JVM告诉您网址格式错误的原因。

你真正想传递给get的不是你的参数列表的字符串表示,而是你的第一个参数:

(let [url (first args)] 
  (client/get url)) ;; Should work!

此外,你不应该在函数中使用def调用 - 它们在命名空间的顶层创建或重新绑定vars,这是不需要的。

您应该使用的是let表单,它们会创建局部变量(例如我的示例中的url)。有关let的更多信息,请查看http://clojure.org/special_forms

我可能会像这样构建你的代码:

(defn -main
  [& args]
  (let [url (first args)
        resp (client/get url)
        server (get-in resp [:headers "server"])]
    (println url)
    (println server)))