如何在Clojure的reitit框架中定义可选query查询参数
实现方法
你用的是基于Clojure的Reitit框架开发接口,要把date查询参数设为可选,按如下修改即可:
修改步骤
- 第一步:调整参数定义,把
date标记为可选
你现有代码中:parameters {:query {:date ::vt-vali/timestamp}}的写法默认参数必填,有两种常用修改方式,按需选择即可:- 直接给参数加可选标记(适配Reitit默认参数解析规则,写法更简洁):
:parameters {:query {:date {:optional true :schema ::vt-vali/timestamp}}}- 用Clojure Spec显式声明可选键(适合项目全局用spec做参数校验的场景):
:parameters {:query (s/keys :opt-un [::vt-vali/timestamp])} - 第二步:适配handler逻辑
确认你的vt-data/ret-nodes函数支持接收nil作为date参数即可正常使用;如果不支持,给参数加默认值即可,示例如下(默认值可按业务需求调整):;; 示例默认值为当前时间戳 (let [date (or date (System/currentTimeMillis)) result (vt-data/ret-nodes env-name date)]
修改后完整参考代码
["/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 {:optional true :schema ::vt-vali/timestamp}}} :responses {200 {:body map?}} :handler (fn [{{{:keys [env-name]} :path {:keys [date]} :query} :parameters}] (let [;; 需要默认值就打开下面这行,不需要可直接删除 ; date (or date 自定义默认时间戳) result (vt-data/ret-nodes env-name date)] (if (s/valid? map? result) {:status 200 :body result} {:status 500 :body result})))}}]]
内容的提问来源于stack exchange,提问作者LetsClojure
相关产品推荐
相关产品推荐

