首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用clj-http试图在clojure中传递args时出错

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

Stack Overflow用户
提问于 2014-02-23 22:53:14
回答 1查看 246关注 0票数 2

希望这对更有经验的人来说是简单的事情。我正在使用clj,并试图传递命令行arg对它(获取一个URL)。我是一个完全的Clojure初学者,但是我已经成功地将args传递给了一个ptintln,它可以工作。

代码语言:javascript
复制
(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))

错误消息

代码语言:javascript
复制
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")

这行得通

代码语言:javascript
复制
(def resp (client/get "http://www.bbc.com"))

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 00:54:54

args是一个列表,这意味着在它上调用str返回列表的表示形式,包括括号和内部引号,正如您在错误跟踪中看到的那样:

代码语言:javascript
复制
(println (str '("http://www.bbc.com")))
;; prints ("http://www.bbc.com")

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

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

代码语言:javascript
复制
(let [url (first args)] 
  (client/get url)) ;; Should work!

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

您应该使用的是let表单,它创建局部变量(如我的示例中的url )。有关let的更多信息,请查看forms

我可能会这样构造您的代码:

代码语言:javascript
复制
(defn -main
  [& args]
  (let [url (first args)
        resp (client/get url)
        server (get-in resp [:headers "server"])]
    (println url)
    (println server)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21975777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档