如何使用 reitit clojure 定义可选查询参数

问题描述 投票:0回答:3

我使用以下代码创建了一个 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})))}}]]

这非常有效。但是,我想让查询参数可选。

有人可以帮我吗?

clojure optional-parameters reitit
3个回答
3
投票

我通过搜索

metosin/reitit
中的示例找到了答案。

可以使用

clojure.spec.alpha
。将
[clojure.spec.alpha :as s]
添加到命名空间所需的依赖项中,您可以使用:

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

请参阅此文件以获取

 metosin/reitit
http-swagger 示例

中的示例

1
投票

这是可能的,但实施取决于您使用的强制类型。在 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 文档。


0
投票

我认为这是不可能的。您可以添加额外的路线:

(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}}]]

© www.soinside.com 2019 - 2024. All rights reserved.