带有默认值的可选查询参数在compojure-api中的使用

14

在使用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\"))",这是为什么?难道库不应该强制/转换字符串值为API声明的指定类型吗?

提前感谢。

2个回答

5
对于您的第一个问题,这是按设计工作的。当您需要布尔查询参数时,Swagger会呈现UI,强制您选择一个值(truefalse,它恰好在第一个位置上显示为true)。
当您将布尔查询参数更改为可选时,第一个空值表示“根本不发送此查询参数”,如果您不将其更改为truefalse,则不会将此查询参数附加到请求中。

关于您的第二个问题,涉及整数查询参数:默认情况下,schema的json-coercion-matcher指定了{{link2:String->Long强制转换,但没有String->Integer}},因此默认情况下不支持Integer。您可以为您的API全局或每个路由指定自己的强制转换器,使用:coercion选项(在compojure-api测试中有一个示例)。您可以提供自己的强制转换器,它可以扩展现有的json-coercion-matcher并包括String->Integer情况。


谢谢您的回答。关于布尔可选参数,如果我定义了默认值,那么这并不重要,因为默认值不会在用户界面上被选择。 - Matheus Moreira
1
@matheus.emm 如果你想让参数是可选的,那么你必须指定默认参数值。否则Swagger UI会强制你选择其中一个值(truefalse),如果你发送请求时没有为该查询参数指定值,你将会收到模式验证错误。如果调用者未提供参数,则需要默认值来分配有效值(根据模式定义)给你的参数。 - Piotrek Bzdyl
@matheus.emm 我已经更新了答案,并提供了如何处理Integer强制转换的信息。 - Piotrek Bzdyl
很好!非常感谢! - Matheus Moreira

0
如果您使用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}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接