14

を使用するときに、オプションのクエリ パラメータをデフォルト値で宣言する適切な方法は何compojure-apiですか?

私のルート要素の1つは次のとおりです(これを読んだ後):

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

最初はブール値のパラメーターが他のパラメーター (例: ) として定義されていましたが、生成された Swagger UI はそれらをデフォルトの値をshow-future Boolean持つコンボボックスとして提示しました。true現在のフォームでは、UI にはオプションが選択されていないコンボボックスが表示されます。同じことがテナントにも起こります。

副次的な質問: Swagger で生成された UI を使用してリクエストを送信すると、エラーが返されます: "levels": "(not (instance? java.lang.Integer \"2\"))". 何故ですか?ライブラリは、文字列値を API によって宣言された指定された型に強制/変換することになっていませんか?

前もって感謝します。

4

2 に答える 2

5

最初の問題については、これは設計どおりに機能しています。boolean クエリ パラメータが必要な場合、Swagger は値を選択するように強制する UI をレンダリングしました (または のいずれtruefalse、最初に true と表示されるだけです)。

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

整数クエリ パラメータに関する 2 番目の問題について: デフォルトでは、スキーマはjson-coercion-matcherString->Long強制String->Integerを指定しますが、そうではないため、すぐに使用できるサポートはありませんInteger:coercionオプションを使用して、API またはルートごとに独自の coercer をグローバルに指定できます( compojure-api test に例があります)。json-coercion-matcher既存のwithString->Integerケースを拡張できる独自の coercer を提供できます。

于 2016-03-07T18:37:43.287 に答える
0

clojure.spec を使用していて、swagger ドキュメントでブール変数のデフォルト値を false にしたい場合は、spec ツール ライブラリを使用して、次のようにすることができます。

(s/def ::show-future 
  (st/spec {:spec boolean?
            :json-schema/example false
            :json-schema/default false}))

次に、クエリ params で:

:query-params [{show-future :- ::show-future false}]
于 2019-04-15T15:55:37.053 に答える