Our API has such endpoints that support parameters both from the query
and from the body
at the same time, by merging those two sets of parameters.
For example:
/foo?param1=value1
body: {
param2=value2
}
The resulting set of parameters would contain two, param1
and param2
.
This endpoint could be used as:
/foo?param1=value1¶m2=value2
OR
/foo
body: {
param1=value1,
param2=value2
}
Is there a way how to specify this 'duality' in Swagger?
UPD
I suppose I should define parameter as both: body
and query
in:
- body
- query
You'll need to define both query parameters and body parameters but mark all of them as optional. Use the operation description
to explain that the client can send the parameters in either query string or body.
swagger: '2.0'
...
paths:
/foo:
post:
consumes:
- application/json
parameters:
- in: query
name: param1
type: string
required: false
- in: query
name: param2
type: string
required: false
- in: body
name: body
required: false
schema:
type: object
properties:
param1:
type: string
param2:
type: string
Using OpenAPI 3.0, it's a bit more elegant in that you can reuse the same schema
for the query string and the request body:
openapi: 3.0.0
...
paths:
/foo:
post:
parameters:
# This expands into ?param1=value1¶m2=value2&...
- in: query
name: parameters
required: false
schema:
$ref: '#/components/schemas/Parameters'
style: form
explode: true
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/Parameters'
responses:
'200':
description: OK
components:
schemas:
Parameters:
type: object
properties:
param1:
type: string
param2:
type: string
Note for Swagger UI users: Serialization of objects into query string seems to be not supported yet as of UI v. 3.11.0.