我使用以下代码创建了一个 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})))}}]]
这非常有效。但是,我想让查询参数可选。
有人可以帮我吗?
我通过搜索
metosin/reitit
中的示例找到了答案。
可以使用
clojure.spec.alpha
。将 [clojure.spec.alpha :as s]
添加到命名空间所需的依赖项中,您可以使用:
:parameters {:query (s/keys :opt-un [::date])}
请参阅此文件以获取
metosin/reitit
http-swagger 示例中的示例
这是可能的,但实施取决于您使用的强制类型。在 Reitit 中,路由和强制是不同的问题,请参阅here了解详细说明。路径元素是不可能的,因为它们是路线的一部分。
已经有一个答案描述了可选参数
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}}]]