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,迫使您选择一个值(true
或 false
,它恰好首先显示为 true)。
当您将布尔查询参数更改为可选时,第一个空值表示“根本不发送此查询参数”,当您不将其更改为 true
或 false
时,它不会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 将强制您选择其中一个值(true
或 false
),如果您发送请求时未指定该查询参数的值,您将收到架构验证错误。默认值是必需的,因此如果调用者未提供参数,则为您的参数分配一个有效值(根据您的架构)。
@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 的可选查询参数(具有默认值)的主要内容,如果未能解决你的问题,请参考以下文章