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.
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. –
@ 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. –
@ matheus.emm Ho aggiornato la risposta con le informazioni su come gestire la coercizione 'Integer'. –