【问题标题】:How to define an optional query parameter with reitit clojure如何使用 reitit clojure 定义可选的查询参数
【发布时间】:2021-08-17 21:20:10
【问题描述】:

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

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: api clojure optional-parameters reitit


    【解决方案1】:

    我通过搜索metosin/reitit 中的示例找到了答案。

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

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

    请参阅此文件以获取 metosin/reitit http-swagger example 中的示例

    【讨论】:

    • 这是否适用于路由中间的参数,如/environments/:env-name/nodes
    • 我不确定。我试过了,路径参数也变成了可选的。但是,由于名称与预期不同,因此未将值赋予我的函数。但是你为什么要这个?路径参数不应该是可选的。
    • GET /environments 将提供所有环境的列表 GET /environments/:env-name 将为您提供名称等于 :env-name 的环境的所有详细信息 GET /environments/:env-name/nodes 将提供环境中所有节点的列表:env 名称。如果你想要所有环境的所有节点,你应该定义一个GET /nodes
    • 我直接从你的问题中得到了中间路径参数的想法(/environments/:env-name/nodes
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多