Шаблон для управления цепочками HTTP-запросов - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно составить цепочку HTTP-запросов к внешнему сервису. Для каждого запроса мне нужно обрабатывать как неудачи, так и случаи успеха. Иногда это может быть более 3 запросов, и это может стать немного неуправляемым. Как можно справиться с этим?

(ns someproject.namespace
  (:require [clj-http.client :as http]))

(defn http-flow []
  (let [resp-1 (http/post some-url-1 {:form-params {:foo "bar"}
                                      :as :json
                                      :throw-exceptions false})
        (if (= (:status resp-1) "200")
          (let [resp-2 (http/post some-url-2 {:form-params {:bar "baz"}
                                              :as :json
                                              :throw-exceptions false})]
            (if (= (:status resp-2) "200")
              {:success true}
              {:success false}))
          {:success false})]))

1 Ответ

0 голосов
/ 09 мая 2018

Итак, я вижу, что вы хотите вернуть одно значение, если все URL-адресов успешны, и вернуть другое, если один из них неуспешен. Это именно то, что делает and.

Я определил вспомогательную функцию для отправки запроса

(defn http-request-succeeded [url params]
  (let [request (http/post url params)]
    (= "200" (:status request))))

И вы можете просто вызвать каждый из них в функции and, как показано ниже:

(if (and (http-request-succeeded some-url-1 params-1)
         (http-request-succeeded some-url-2 params-2))
  {:success true}
  {:success false})

Или используйте макрос для большего повторного использования / ясности:

(defmacro do-all-> [& requests]
  `(if (every? identity ~requests)
     {:success true}
     {:success false}))

(do-all-> (http-request-succeeded some-url-1 params-1)
          (http-request-succeeded some-url-2 params-2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...