2016-03-07 66 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 ...)) 

起初,其中定義爲其他的(例如show-future Boolean),但所生成的揚鞭UI呈現它們作爲組合框布爾PARAMS默認值爲true。在目前的形式中,用戶界面顯示了一個沒有選擇選項的組合框。租戶也是如此。

一方面的問題:當我使用Swagger生成的UI發送請求並返回錯誤時:"levels": "(not (instance? java.lang.Integer \"2\"))"。這是爲什麼?庫不是應該強制/將字符串值轉換爲由API聲明的指定類型嗎?

在此先感謝。

回答

5

對於你的第一個問題,這是按照設計工作。當你需要你的布爾查詢參數時,Swagger呈現了UI,這迫使你選擇一個值(truefalse,它恰好在第一位顯示爲真)。

當你改變布爾查詢參數是可選的,那麼第一個空值表示「完全不發送這個查詢參數」,當你不將其更改爲truefalse它不會追加此查詢參數到請求。

關於你的第二個問題與整數查詢參數:默認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-matcherString->Integer的情況。

+0

謝謝你的回答。所以關於布爾可選參數,如果我定義一個默認值並不重要,因爲在UI上沒有選擇默認值。 –

+1

@ matheus.emm如果您希望它是可選的,您必須指定默認參數值。否則Swagger UI會強制你選擇其中一個值('true'或'false'),如果你發送的請求沒有爲該查詢參數指定一個值,你會得到schema驗證錯誤。默認值是必需的,所以如果你的參數沒有被調用者提供,那麼你的參數有一個有效的值(根據你的模式)。 –

+0

@ matheus.emm我已經更新瞭如何處理Integer強制的信息。 –