使用Clojure发出多个API请求的功能方式



我正在开发一个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))))

您可以尝试以下操作:

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

最新更新