2016-03-07 19 views
12

Qual è il modo corretto di dichiarare un parametro di query facoltativo, con valore predefinito, quando si utilizza compojure-api?Parametri di query facoltativi (con valore predefinito) con compojure-api

Uno dei miei elementi percorso è il seguente (dopo aver letto 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 ...)) 

In un primo momento i params booleane dove definito come gli altri (ad es show-future Boolean) ma il generato Swagger UI li presenta come un combobox con valore true come predefinito. Nel presente modulo l'interfaccia utente mostra una casella combinata senza alcuna opzione selezionata. Lo stesso succede con l'inquilino.

Una domanda a parte: quando utilizzo l'interfaccia utente generata da Swagger per inviare una richiesta, viene restituito un errore: "levels": "(not (instance? java.lang.Integer \"2\"))". Perché? La libreria non dovrebbe forzare/convertire i valori stringa nei tipi designati dichiarati dall'API?

Grazie in anticipo.

risposta

5

Per il primo problema, funziona come previsto. Quando hai richiesto la tua query booleana param, Swagger ha reso l'interfaccia utente che ti obbliga a scegliere un valore (true o false, accade solo che venga visualizzato true al primo posto).

Quando si è cambiato il parametro di query booleana ad essere facoltativo, quindi il primo valore vuoto significa "non inviare la query param a tutti" e quando non si cambia in true o false non aggiungerà questo query param alla richiesta.

Per quanto riguarda il secondo problema con interrogazione intero param: per default schema's json-coercion-matcher specifica String->Long coercion but not String->Integer quindi non c'è alcun supporto per Integer out of the box. Puoi specificare il tuo coercitore a livello globale per la tua API o per percorso utilizzando l'opzione :coercion (there is an example in compojure-api test). È possibile fornire il proprio coercitore che potrebbe estendere l'esistente json-coercion-matcher con il caso String->Integer.

+0

Grazie per la risposta. Quindi, riguardo al parametro opzionale booleano, non importa se definisco un valore predefinito, poiché il valore predefinito non è selezionato nell'interfaccia utente. –

+1

@ matheus.emm È necessario specificare il valore del parametro predefinito se si desidera che sia facoltativo. Altrimenti l'UI di Swagger ti costringerà a scegliere uno dei valori ('true' o' false') e se invii la richiesta senza specificare un valore per quel parametro di query otterrai l'errore di convalida dello schema. Il valore predefinito è richiesto in modo che il parametro abbia un valore valido assegnato (in base allo schema) se non è fornito dal chiamante. –

+0

@ matheus.emm Ho aggiornato la risposta con le informazioni su come gestire la coercizione 'Integer'. –

Problemi correlati