使用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声明的指定类型?
提前致谢。
答案 0 :(得分:5)
对于您的第一个问题,这是按设计工作的。当你需要你的布尔查询参数时,Swagger会渲染UI,迫使你选择一个值(true
或false
,它恰好在第一个地方显示为真)。
当您将布尔查询参数更改为可选时,则第一个空值意味着“不发送此查询参数”#34;当您不将其更改为true
或false
时,它不会将此查询参数附加到请求中。
关于整数查询参数的第二个问题:默认情况下schema's json-coercion-matcher
指定String->Long
coercion but not String->Integer
,因此不支持Integer
开箱即用。您可以使用:coercion
选项(there is an example in compojure-api test)为您的API或每条路线全局指定自己的coercer。您可以提供自己的coercer,可以扩展现有的json-coercion-matcher
String->Integer
案例。
答案 1 :(得分:0)
如果您使用clojure.spec,并且想要在swagger文档中将布尔变量作为默认值false,则可以使用spec工具库并执行以下操作:
(s/def ::show-future
(st/spec {:spec boolean?
:example false
:json-schema/default false}))
然后,在您的查询参数中:
:query-params [{show-future :- ::show-future false}]