compojure-api 的可选查询参数(具有默认值)

Posted

技术标签:

【中文标题】compojure-api 的可选查询参数(具有默认值)【英文标题】:Optional query parameters (with default value) with compojure-api 【发布时间】:2016-06-21 10:15:05 【问题描述】:

使用compojure-api 时,使用默认值声明可选查询参数的正确方法是什么?

我的一个路由元素如下(看完this):

(GET "/:id/descendants" [id]
     :return [d/CategoryTreeElement]
     :path-params [id :- Long]
     :query-params [context-type :- d/ContextType
                    levels :- Integer
                    tenant :- d/Tenant :DEF_TENANT
                    show-future :- Boolean false
                    show-expired :- Boolean false
                    show-suppressed :- Boolean false
     :summary "Fetch category descendants"
     (ok ...))

起初,布尔参数定义为其他参数(例如show-future Boolean),但生成的 Swagger UI 将它们显示为默认为 true 值的组合框。在当前表单中,UI 显示了一个未选择任何选项的组合框。租户也是如此。

一个问题:当我使用 Swagger 生成的 UI 发送请求并返回错误时:"levels": "(not (instance? java.lang.Integer \"2\"))"。这是为什么?库不应该将字符串值强制/转换为 API 声明的指定类型吗?

提前致谢。

【问题讨论】:

【参考方案1】:

对于您的第一个问题,这是按设计工作的。当您需要布尔查询参数时,Swagger 会呈现 UI,迫使您选择一个值(truefalse,它恰好首先显示为 true)。

当您将布尔查询参数更改为可选时,第一个空值表示“根本不发送此查询参数”,当您不将其更改为 truefalse 时,它不会t 将此查询参数附加到请求中。

关于整数查询参数的第二个问题:默认情况下schema's json-coercion-matcher 指定String->Long coercion but not String->Integer,因此不支持开箱即用的Integer。您可以使用 :coercion 选项 (there is an example in compojure-api test) 为您的 API 或每个路由全局指定您自己的强制器。您可以提供自己的强制器,可以将现有的 json-coercion-matcher 扩展为 String->Integer 案例。

【讨论】:

感谢您的回答。所以关于布尔可选参数,我是否定义一个默认值并不重要,因为在 UI 上没有选择默认值。 @matheus.emm 如果您希望它是可选的,您必须指定默认参数值。否则 Swagger UI 将强制您选择其中一个值(truefalse),如果您发送请求时未指定该查询参数的值,您将收到架构验证错误。默认值是必需的,因此如果调用者未提供参数,则为您的参数分配一个有效值(根据您的架构)。 @matheus.emm 我已经用如何处理Integer coercion 的信息更新了答案。 不错!非常感谢!【参考方案2】:

如果您使用 clojure.spec 并且希望在您的 swagger 文档中将默认值 false 作为布尔变量,您可以使用规范工具库并执行以下操作:

(s/def ::show-future 
  (st/spec :spec boolean?
            :json-schema/example false
            :json-schema/default false))

然后,在您的查询参数中:

:query-params [show-future :- ::show-future false]

【讨论】:

以上是关于compojure-api 的可选查询参数(具有默认值)的主要内容,如果未能解决你的问题,请参考以下文章

Argparse:具有可变参数的选项的可选参数

Android Room 的可选查询参数

Hibernate中带有命名查询的可选参数?

带有查询 Spring-Boot jpa 1.5 的可选参数

Spring boot:Query方法中的可选参数查询

为具有更多限制性默认值的可选参数强制使用更广泛的类型