What is the proper way to declare an optional query parameter, with default value, when using compojure-api
?
One of my route elements is as follows (after reading 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 ...))
At first the boolean params where defined as the other ones (e.g. show-future Boolean
) but the generated Swagger UI presented them as a combobox with true
value as default. In the present form the UI shows a combobox with no option selected. The same happens with tenant.
One side question: when I use Swagger generated UI to send a request and error is returned: "levels": "(not (instance? java.lang.Integer \"2\"))"
. Why is that? Isn't the library supposed to coerce/convert string values to the designated types declared by the API?
Thanks in advance.
As query parameters are not a fixed part of a path, they can be optional and can have default values.
Yes, mandatory parameters can be used in query parameters. In that case you need to put a validation after the API is hit to check whether the value of the parameter is not null and is of specified format.
What are API Query Parameters? API Query parameters can be defined as the optional key-value pairs that appear after the question mark in the URL. Basically, they are extensions of the URL that are utilized to help determine specific content or action based on the data being delivered.
For your first issue, this is working as designed. When you had your boolean query param required, Swagger rendered the UI which forces you to choose a value (either true
or false
, it just happens that it displays true on the first place).
When you changed the boolean query param to be optional, then the first empty value means "don't send this query param at all" and when you don't change it to true
or false
it won't append this query param to the request.
Regarding your second issue with integer query param: by default schema's json-coercion-matcher
specifies String->Long
coercion but not String->Integer
so there is no support for Integer
out of the box. You can specify your own coercer globally for your API or per route by using :coercion
option (there is an example in compojure-api test). You could provide your own coercer which could extend the existing json-coercion-matcher
with String->Integer
case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With