2016-03-07 3 views
12

Каков правильный способ объявить необязательный параметр запроса со значением по умолчанию при использовании compojure-api?Необязательные параметры запроса (со значением по умолчанию) с 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 ...)) 

В первом булева Params, где определен как другие из них (например, show-future Boolean), но сгенерированный Куража UI представивших их как выпадающий список с значением true по умолчанию. В представленной форме пользовательский интерфейс отображает выпадающий список, который не выбран. То же самое происходит с арендатором.

Одна сторона вопрос: когда я использую Swagger сгенерированный интерфейс, чтобы отправить запрос, и возвращается ошибка: "levels": "(not (instance? java.lang.Integer \"2\"))". Почему это? Разве библиотека не должна принуждать/преобразовывать значения строк в назначенные типы, объявленные API?

Заранее спасибо.

ответ

5

Для вашей первой проблемы это работает так, как было разработано. Когда вам нужен ваш логический параметр запроса, Swagger отобразил пользовательский интерфейс, который заставляет вас выбрать значение (либо true, либо false, просто случается, что он отображает true на первом месте).

Когда вы изменили параметр логического запроса как необязательный, то первое пустое значение означает «не отправлять этот параметр запроса вообще», и когда вы не измените его на true или false, он не добавит этого параметр запроса к запросу.

Что касается вашей второй проблемы с параметром целочисленного запроса: по умолчанию schema's json-coercion-matcher указывает String->Long coercion but not String->Integer, поэтому нет поддержки для Integer из коробки. Вы можете указать свой собственный коэрцитер по всему миру для вашего API или для каждого маршрута, используя опцию :coercion (there is an example in compojure-api test). Вы можете предоставить свой собственный коэрцитер, который может расширить существующий json-coercion-matcher с помощью String->Integer чехла.

+0

Спасибо вам за ответ. Итак, о логическом необязательном параметре, не имеет значения, определяю ли значение по умолчанию, поскольку значение по умолчанию не выбрано в пользовательском интерфейсе. –

+1

@ matheus.emm Вам нужно указать значение параметра по умолчанию, если вы хотите, чтобы оно было необязательным. В противном случае пользовательский интерфейс Swagger заставит вас выбрать одно из значений ('true' или' false'), и если вы отправите запрос без указания значения для этого параметра запроса, вы получите ошибку проверки схемы. Значение по умолчанию требуется, чтобы у вашего параметра было допустимое значение, назначенное (в соответствии с вашей схемой), если оно не предоставлено вызывающим абонентом. –

+0

@ matheus.emm Я обновил ответ с информацией о том, как обращаться с принуждением Integer. –