带有 compojure-api 的可选查询参数(具有默认值)
Optional query parameters (with default value) with compojure-api
使用 compojure-api
时,声明可选查询参数的正确方法是什么?
我的其中一个路线要素如下(看完):
(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\"))"
。这是为什么?库不应该 coerce/convert 将值字符串化为 API 声明的指定类型吗?
提前致谢。
对于您的第一期,这是按设计工作的。当您需要布尔查询参数时,Swagger 会呈现 UI,它会强制您选择一个值(true
或 false
,恰好它首先显示为 true) .
当您将布尔查询参数更改为可选时,第一个空值表示 "don't send this query param at all",当您不将其更改为 true
或 false
时,它不会t 将此查询参数附加到请求中。
关于整数查询参数的第二个问题:默认 schema's json-coercion-matcher
specifies String->Long
coercion but not String->Integer
so there is no support for Integer
out of the box. You can specify your own coercer globally for your API or per route by using :coercion
option (there is an example in compojure-api test)。您可以提供自己的强制器,它可以将现有的 json-coercion-matcher
扩展为 String->Integer
案例。
如果你使用 clojure.spec 并且你想在你的 swagger 文档中为布尔变量设置默认值 false,你可以使用 spec 工具库并执行类似的操作:
(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
时,声明可选查询参数的正确方法是什么?
我的其中一个路线要素如下(看完
(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\"))"
。这是为什么?库不应该 coerce/convert 将值字符串化为 API 声明的指定类型吗?
提前致谢。
对于您的第一期,这是按设计工作的。当您需要布尔查询参数时,Swagger 会呈现 UI,它会强制您选择一个值(true
或 false
,恰好它首先显示为 true) .
当您将布尔查询参数更改为可选时,第一个空值表示 "don't send this query param at all",当您不将其更改为 true
或 false
时,它不会t 将此查询参数附加到请求中。
关于整数查询参数的第二个问题:默认 schema's json-coercion-matcher
specifies String->Long
coercion but not String->Integer
so there is no support for Integer
out of the box. You can specify your own coercer globally for your API or per route by using :coercion
option (there is an example in compojure-api test)。您可以提供自己的强制器,它可以将现有的 json-coercion-matcher
扩展为 String->Integer
案例。
如果你使用 clojure.spec 并且你想在你的 swagger 文档中为布尔变量设置默认值 false,你可以使用 spec 工具库并执行类似的操作:
(s/def ::show-future
(st/spec {:spec boolean?
:json-schema/example false
:json-schema/default false}))
然后,在您的查询参数中:
:query-params [{show-future :- ::show-future false}]