Как определить необязательный параметр запроса с помощью reitit clojure

Я создал API, используя следующий код:

         ["/environments/:env-name/nodes"
    {:swagger {:tags ["Nodes"]}
     :parameters {:path {:env-name ::vt-vali/name}}}
    [""
     {:get {:summary "Retrieve the nodes from this environment"
            :parameters {:query {:date ::vt-vali/timestamp}}
            :responses {200 {:body map?}}
            :handler (fn [{{{:keys [env-name]} :path
                            {:keys [date]} :query} :parameters}]
                       (let [result (vt-data/ret-nodes env-name date)]
                         (if (s/valid? map? result)
                           {:status 200
                            :body result}
                           {:status 500
                            :body result})))}}]]

Это прекрасно работает. Однако я хочу сделать параметр запроса необязательным.

Кто-нибудь может мне с этим помочь?

3 ответа

Я нашел ответ, просмотрев примеры в metosin/reitit.

Можно использовать clojure.spec.alpha. Добавлять [clojure.spec.alpha :as s] к требуемым зависимостям пространства имен, и вы можете использовать:

:parameters {:query (s/keys :opt-un [::date])}

См. Этот файл для примера в metosin/reitit Пример http-swagger

Это возможно, но реализация зависит от того, какой тип принуждения вы используете. В Reitit маршрутизация и приведение являются отдельными задачами, подробное объяснение см. здесь .Это невозможно для элементов пути, поскольку они являются частью маршрута.

Уже есть ответ, описывающий необязательные параметры.clojure.specпринуждение. Если вы используетеmalliВместо этого необязательный параметр запроса может выглядеть так:

      ["/hello" {:get {:parameters {:query [:map [:a {:optional true} int?]
                                           [:b int?]]}}
                 :responses {200 {:body [:map [:total pos-int?]]}}
                 :handler handler}}]

Для получения дополнительной информации прочтите документацию malli .

Я не думаю, что это можно сделать. Вы можете добавить дополнительный маршрут:

      (defn handler [{{{:keys [env-name]} :path
                 {:keys [date]} :query} :parameters}]
  (let [result (vt-data/ret-nodes env-name date)]
    (if (s/valid? map? result)
      {:status 200
       :body result}
      {:status 500
       :body result})))

["/environments/nodes"
 {:swagger {:tags ["Nodes"]}
  :parameters {:path {:env-name ::vt-vali/name}}}
 [""
  {:get {:summary "Retrieve the nodes from this environment"
         :parameters {:query {:date ::vt-vali/timestamp}}
         :responses {200 {:body map?}}
         :handler handler}}]
 "/environments/:env-name/nodes"
 {:swagger {:tags ["Nodes"]}
  :parameters {:path {:env-name ::vt-vali/name}}}
 [""
  {:get {:summary "Retrieve the nodes from this environment"
         :parameters {:query {:date ::vt-vali/timestamp}}
         :responses {200 {:body map?}}
         :handler handler}}]]

Другие вопросы по тегам