Mat*_*ira 13 clojure compojure 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 ...))
Run Code Online (Sandbox Code Playgroud)
首先,布尔参数定义为其他(例如show-future Boolean),但生成的Swagger UI将它们显示为组合框,其true值为默认值.在当前形式中,UI显示没有选择选项的组合框.租户也是如此.
一方面问题:当我使用Swagger生成的UI发送请求并返回错误时:"levels": "(not (instance? java.lang.Integer \"2\"))".这是为什么?是不是库应该强制/转换字符串值到API声明的指定类型?
提前致谢.
对于您的第一个问题,这是按设计工作的.当你有需要你的布尔查询参数,扬鞭渲染这迫使你选择一个值(用户界面true或者false,它只是碰巧它显示真正的第一名).
当您将布尔查询参数更改为可选时,则第一个空值表示"根本不发送此查询参数",并且当您不将其更改为true或者false它不会将此查询参数附加到请求时.
关于整数查询参数的第二个问题:默认情况下,模式json-coercion-matcher指定String->Long强制,但不是String->Integer这样,不支持Integer开箱即用.您可以使用:coercion选项(在compojure-api测试中有一个示例)为您的API或每条路径全局指定自己的coercer .您可以提供自己的coercer,可以扩展现有json-coercion-matcher的String->Integer案例.