Необязательные параметры запроса (со значением по умолчанию) с 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, представляли их как значение со значением true
по умолчанию. В представленной форме пользовательский интерфейс отображает выпадающий список, который не выбран. То же самое происходит с арендатором.
Один вопрос: когда я использую сгенерированный пользовательский интерфейс Swagger для отправки запроса и ошибки возвращается: "levels": "(not (instance? java.lang.Integer \"2\"))"
. Почему это? Разве библиотека не должна принуждать/преобразовывать значения строк в назначенные типы, объявленные API?
Спасибо заранее.
Ответы
Ответ 1
Для вашей первой проблемы это работает так, как было разработано. Когда у вас был требуемый параметр логического запроса, Swagger отобразил пользовательский интерфейс, который заставляет вас выбрать значение (либо true
, либо false
), просто происходит, что он отображает true на первом месте).
Когда вы изменили параметр boolean query как необязательный, тогда первое пустое значение означает "вообще не отправлять этот параметр запроса", и когда вы не измените его на true
или false
, он выиграл ' t добавьте этот параметр запроса в запрос.
Что касается вашей второй проблемы с параметром целочисленного запроса: по умолчанию schema json-coercion-matcher
указывает String->Long
, но не String->Integer
, поэтому нет поддержки Integer
из коробки. Вы можете указать свой собственный коэрцитер по всему миру для вашего API или для каждого маршрута, используя опцию :coercion
(
Ответ 2
Если вы используете clojure.spec и хотите в качестве значения по умолчанию false в документации по swagger для логической переменной, вы можете использовать библиотеку инструментов spec и сделать что-то вроде:
(s/def ::show-future
(st/spec {:spec boolean?
:json-schema/example false
:json-schema/default false}))
Затем в параметрах вашего запроса:
:query-params [{show-future :- ::show-future false}]