希望这对于那些经验丰富的人来说很简单。我正在使用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"))
提前感谢。
答案 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)))