【问题标题】:Optional query parameters (with default value) with compojure-apicompojure-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 声明的指定类型吗?

提前致谢。

【问题讨论】:

    标签: clojure compojure compojure-api


    【解决方案1】:

    对于您的第一个问题,这是按设计工作的。当您需要布尔查询参数时,Swagger 会呈现 UI,迫使您选择一个值(truefalse,它恰好首先显示为 true)。

    当您将布尔查询参数更改为可选时,第一个空值表示“根本不发送此查询参数”,当您不将其更改为 truefalse 时,它不会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 将强制您选择其中一个值(truefalse),如果您发送请求时未指定该查询参数的值,您将收到架构验证错误。默认值是必需的,因此如果调用者未提供参数,则为您的参数分配一个有效值(根据您的架构)。
    • @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}]
    

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 1970-01-01
      • 2020-08-23
      • 2013-04-25
      • 2021-09-24
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多