Как определить необязательный параметр запроса с помощью 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}}]]