How to define an optional parameter in path using swagger
There is a function in my REST web service working with GET method and it has two optional parameters.
I tried to define it in Swagger but I encountered an error, Not a valid parameter definition, after I set the required
as false
.
I found out that if I set the required
value as true
the error will be gone. Here is a sample of my Swagger code.
...
paths:
'/get/{param1}/{param2}':
get:
...
parameters:
- name: param1
in: path
description: 'description regarding param1'
required: false
type: string
- name: param2
in: path
description: 'description regarding param2'
required: false
type: string
I didn't experience this with parameters in body or the the ones in query. I think this problem is only related to parameters in path. I could not find any solution in swagger specification files either.
Is there any other way to define optional parameters in Swagger or do I have any mistake in my code?
Any help would be appreciated.
Solution 1:
Given that path parameter must be required according to the OpenAPI/Swagger spec, you can consider adding 2 separate endpoints with the following paths:
-
/get/{param1}/{param2}
when param2 is provided -
/get/{param1}/
when param2 is not provided
Solution 2:
It it likely blowing up because you cannot have a base uri parameter optional, only query string values (in the case of a url).
For example:
- GET /products/{id}/pricing?foo=bar
- ** If foo is optional then your IN parameter needs to be "query" not "path"
- ** If {id} is optional then something is wrong. {id} can't be optional because it is contained within the base uri.
This should work:
{
"in":"query",
"required":false
}
This should not work
{
"in":"path",
"required":false
}
change your "in" property to be "query" instead of "path" and it should work.
Solution 3:
Your YAML fails because as it stated on the specification:
Determines whether this parameter is mandatory. If the parameter is in "path", this property is required and its value MUST be true.
Source: http://swagger.io/specification/#parameterObject (Look in fixed fields table)
Solution 4:
Sad but fact there is no official support for optional parameters still in 2020 and in 3.* specification: https://github.com/OAI/OpenAPI-Specification/issues/93
You can only apply some workaround mentioned in other answers (describe several endpoints for every set of parameters; convert your API to work with query-parameters instead of path-parameters).
Personally I decided to just leave everything as is, just add a parameter description
which clearly says "This parameter is OPTIONAL!". Should be clear enough for everyone who reads the API.
Solution 5:
Try adding 2 endpoints for the same API. like
/get/{param1}/{param2}
and /get/{param1}/{param2}/{param3}