带有 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,它会强制您选择一个值(truefalse,恰好它首先显示为 true) .

当您将布尔查询参数更改为可选时,第一个空值表示 "don't send this query param at all",当您不将其更改为 truefalse 时,它不会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}]