2016-03-07 9 views
12

Wie kann ein optionaler Abfrageparameter mit dem Standardwert compojure-api deklariert werden?Optionale Abfrageparameter (mit Standardwert) mit Compojure-API

Einer meiner Route Elemente ist wie folgt (nach this Lesen):

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

Zunächst werden die boolean params wo wie die anderen definiert (zB show-future Boolean), aber die erzeugte Swagger UI präsentiert sie als Combobox mit true Wert als Standard. In der vorliegenden Form zeigt die Benutzeroberfläche eine Combobox ohne ausgewählte Option. Das gleiche passiert mit dem Mieter.

Eine Seite Frage: Wenn ich Swagger generierte Benutzeroberfläche verwenden, um eine Anfrage zu senden und Fehler zurückgegeben: "levels": "(not (instance? java.lang.Integer \"2\"))". Warum das? Soll die Bibliothek Zeichenkettenwerte nicht in die vom API deklarierten Typen konvertieren/konvertieren?

Vielen Dank im Voraus.

Antwort

5

Für Ihre erste Ausgabe funktioniert dies wie vorgesehen. Wenn Sie Ihren Booleschen Abfrageparameter benötigen, hat Swagger die Benutzeroberfläche gerendert, die Sie zwingt, einen Wert zu wählen (entweder true oder false, es passiert einfach, dass es true an erster Stelle anzeigt).

Wenn Sie den booleschen Abfrageparameter als optional geändert haben, bedeutet der erste leere Wert "Diesen Abfrageparameter überhaupt nicht senden" und wenn Sie ihn nicht in true oder ändern, wird dies nicht angehängt Abfrageparameter zur Anfrage.

In Bezug auf Ihr zweites Problem mit Integer-Abfrageparameter: standardmäßig schema's json-coercion-matcher gibt String->Long coercion but not String->Integer, so gibt es keine Unterstützung für Integer out of the Box. Sie können Ihren eigenen Coercer global für Ihre API oder pro Route angeben, indem Sie die Option :coercion (there is an example in compojure-api test) verwenden. Sie könnten Ihren eigenen Zwangsarbeiter zur Verfügung stellen, der den bestehenden Fall erweitern könnte.

+0

Vielen Dank für Ihre Antwort. Über den booleschen optionalen Parameter ist es egal, ob ich einen Standardwert definiere, da der Standardwert auf der Benutzeroberfläche nicht ausgewählt ist. –

+1

@ matheus.emm Sie müssen den Standardwert für den Parameter angeben, wenn dieser optional sein soll. Ansonsten zwingt Swagger UI Sie, einen der Werte auszuwählen ('true' oder' false'). Wenn Sie die Anfrage senden, ohne einen Wert für diesen Abfrageparameter anzugeben, erhalten Sie einen Schema-Validierungsfehler. Der Standardwert ist erforderlich, damit Ihrem Parameter ein gültiger Wert zugewiesen wird (gemäß Ihrem Schema), wenn er nicht vom Aufrufer bereitgestellt wird. –

+0

@ matheus.emm Ich habe die Antwort mit der Info aktualisiert, wie man mit "Integer" -Korrektur umgehen kann. –

Verwandte Themen