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 声明的指定类型吗?

提前致谢。

4

2 回答 2

5

对于您的第一个问题,这是按设计工作的。当您需要布尔查询参数时,Swagger 会呈现强制您选择一个值的 UI(true或者false,它只是碰巧首先显示为 true)。

当您将布尔查询参数更改为可选时,第一个空值表示“根本不发送此查询参数”,并且当您不将其更改为truefalse不会将此查询参数附加到请求时。

关于整数查询参数的第二个问题:默认情况下,模式json-coercion-matcher指定String->Long强制,但不String->Integer支持Integer开箱即用。:coercion您可以使用选项为您的 API 或每个路由全局指定您自己的强制器(在 compojure-api test 中有一个示例)。您可以提供自己的强制器,可以扩展现有json-coercion-matcherString->Integer案例。

于 2016-03-07T18:37:43.287 回答
0

如果您使用 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}]
于 2019-04-15T15:55:37.053 回答