如何扩展此代码示例还包括基本身份验证信息?

时间:2016-02-21 18:24:24

标签: clojure

我是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函数......

1 个答案:

答案 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)))