使用Clojure进行多个API请求的功能方法

时间:2013-09-04 10:46:35

标签: api clojure functional-programming

我正在开发一个Clojure应用程序,该应用程序将与Web API交互以返回符合特定条件的随机结果。由于API的限制,我必须检索大量结果并使用Clojure过滤掉适当的结果。

我会说99%或更多的时间,第一次请求的结果中至少有一个符合我的标准。但由于其他1%,我觉得我必须构建功能来发出多个请求。显然,第二个请求成功的可能性非常大,但我对于编写一个无休止地重复的函数,直到它得到正确的结果以防万一出错并最终DDoSing API。

我的第一个想法是在函数中构建一个计数器,并将其限制为五个请求。但作为一种方法,这感觉有点程序化。什么是惯用的Clojure方式呢?

这是我到目前为止所拥有的:

(ns randchar.api
  (:require [clj-http.client :as client]))

(defn api-request 
  [url]
  (get-in
    (client/request
      {:url url
       :method :get
       :content-type :json
       :as :json}) [:body :results]))

(defn filter-results
  "Returns the first result that meets the criterion."
  [results criterion]
  (take 1 
        (filter #(= (get-in % [:nested :sub-nested]) criterion) results)))

(defn build-url
  "Returns a url with randomized query string for the api request; not shown."
  []
  )

(defn return-result
  "Currently recurs endlessly if no results meet the criterion."
  [criterion]
  (let [x (filter-results (api-request (build-url)) criterion)]
    (if (not (empty? x))
      x
      (recur))))

1 个答案:

答案 0 :(得分:3)

您可以尝试以下内容:

(defn return-result
  [criterion count]
  (->> (repeatedly count #(filter-results (api-request build-url) criterion))
       (filter (complement empty?))
       first))