2016-03-07 10 views
12

compojure-apiを使用する場合、省略可能なクエリパラメータをデフォルト値で宣言する適切な方法は何ですか?compojure-apiを使用したオプションのクエリパラメータ(既定値)

次のように私のルート要素の一つは、(thisを読んだ後)である。他のもの(例えばshow-future Boolean)として定義された最初のブールのparamsで

(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 ...)) 

が、生成された闊歩UIは、コンボボックスとしてそれらを提示既定値はtrueです。現在のフォームでは、選択されていないコンボボックスがUIに表示されます。テナントも同様です。

片方の質問:SwaggerでUIを生成してリクエストを送信すると、エラーが返されます。"levels": "(not (instance? java.lang.Integer \"2\"))"。何故ですか?ライブラリがAPIによって宣言された指定された型にストリング値を変換/変換することは想定されていませんか?

ありがとうございます。

答えて

5

最初の問題として、これは設計どおりに動作しています。ブール値のクエリパラメータが必要だった場合は、値を選択するUIをSwaggerでレンダリングしました(trueまたはfalseのいずれかを選択すると、最初にtrueと表示されます)。

ブール型クエリのparamをオプションに変更した場合、最初の空の値は「このクエリのパラメータをまったく送信しない」ことを意味し、trueまたはfalseに変更しないと、リクエストに対するクエリパラメタ。

整数クエリパラメータの2番目の問題について:デフォルトではschema's json-coercion-matcherString->Long coercion but not String->Integerと指定されているため、そのままIntegerのサポートはありません。 :coercionオプション(there is an example in compojure-api test)を使用して、APIまたはルートごとに独自のコアサーをグローバルに指定できます。あなたはの場合、既存のjson-coercion-matcherを拡張することができますあなた自身のcoercerを提供することができます。

+0

お返事ありがとうございます。したがって、ブール値のオプションパラメータについては、UIでデフォルト値が選択されていないので、デフォルト値を定義しても問題ありません。 –

+1

@ matheus.emm省略可能にするには、デフォルトのパラメータ値を指定する必要があります。それ以外の場合、Swagger UIは値のいずれか( 'true'または' false')を強制的に選択し、そのクエリパラメータの値を指定せずにリクエストを送信すると、スキーマの検証エラーが発生します。デフォルト値は必須です。パラメータには、呼び出し元によって指定されていないパラメータ(スキーマに従って)が割り当てられています。 –

+0

@ matheus.emm「Integer」強制を処理する方法に関する情報を更新しました。 –

関連する問題