我是Clojure的新手,并且正在使用HTTP-Kit中的以下示例来执行异步获取请求,然后在准备就绪时将所有结果一起处理。在我的情况下,我还必须提供基本的身份验证信息,因此这里给出的示例(http://www.http-kit.org/client.html#combined)不起作用,我没有找到一个很好的解决方案如何传递额外的基本身份验证信息。
(let [urls ["http://server.com/api/1" "http://server.com/api/2"
"http://server.com/api/3"]
;; send the request concurrently (asynchronously)
futures (doall (map http/get urls))]
(doseq [resp futures]
;; wait for server response synchronously
(println (-> @resp :opt :url) " status: " (:status @resp))
)
使用基本身份验证的单个调用如下所示:
(def options {:basic-auth ["myuser" "mypwd"]})
(http/get url options)
很容易一个接一个地进行同步调用。使用异步变体我不知道如何以正确的方式传递选项。代码示例使用map来调用http / get以及url的所有元素。我需要一种传递两个参数的方法,然后将这两个参数应用于http / get调用。但是当我刚开始学习Clojure时,我找不到正确的方法......我看了一下apply / map / anonymous函数......
答案 0 :(得分:0)
您需要将身份验证选项传递到http/get
表达式中的每个map
调用。例如:
(map (fn [url] (http/get url options))
urls)
或更短的版本:
(map #(http/get % options) url)
完整示例:
(let [urls ["http://server.com/api/1" "http://server.com/api/2" "http://server.com/api/3"]
options {:basic-auth ["myuser" "mypwd"]}
;; send the request concurrently (asynchronously)
futures (doall (map #(http/get % options) urls))]
(doseq [resp futures]
;; wait for server response synchronously
(println (-> @resp :opt :url) " status: " (:status @resp)))