Support deep objects for query parameters with deepObject style
See original GitHub issueBackground
Many applications expect deeply nested objects in input parameters, see the discussion in swagger-ui starting from this comment: https://github.com/swagger-api/swagger-ui/issues/4064#issuecomment-357417513 In LoopBack, we are running into this problem too, see https://github.com/strongloop/loopback-next/pull/1679.
Consider a filter
parameter defined as follows:
parameters:
filterParam:
in: query
name: filter
schema:
type: object
style: deepObject
explode: true
description: Options for filtering the results
required: false
Let’s say the user wants to provide the following value, for example by entering a JSON into the text area rendered by swagger-ui:
{
"name": "ivan",
"birth-date": {
"gte": "1970-01-01"
}
}
At the moment, the OpenAPI Specification v3 does not describe how to encode such value in a query string. As a result, OpenAPI clients like swagger-ui don’t know how to handle this input - see the discussion in https://github.com/swagger-api/swagger-js/issues/1385 for an example.
Proposal
The following query string should be created by swagger-js client for the input value shown above.
filter[name]=ivan&filter[birth-date][qte]=1970-01-01
The proposed serialization style is supported by https://www.npmjs.com/package/qs, which is used by http://expressjs.com as the default query parser, which means that a vast number of Node.js API servers are already expecting this serialization style.
I am not sure if there is any existing formal specification of this format, I am happy to look into that once my proposal gets considered as acceptable in principle.
Additional information
Existing issues that are touching a similar topic:
- style: form + object looses the parameter name? #1006
- Are indexes in the query parameter array representable? #1501
Two older comments from swagger-js that may be relevant:
https://github.com/swagger-api/swagger-js/pull/1140
Limitations: deepObject does not handle nested objects. The specification and swagger.io documentation does not provide an example for serializing deep objects. Flat objects will be serialized into the deepObject style just fine.
https://github.com/swagger-api/swagger-js/pull/1140#issuecomment-333017825
As for deepObject and nested objects - that was explicitly left out of the spec, and it’s ok to just Not Support It™.
Issue Analytics
- State:
- Created 5 years ago
- Reactions:197
- Comments:50 (9 by maintainers)
Top GitHub Comments
Hey @earth2marsh and @darrelmiller … We (Directus team) have been trying to use OpenAPI 3.0 for a while now, but the lack of support for nested deepObjects has kept us from using this spec. We have a dynamic API that allows for relatively complex filtering, for example:
filter[<field-name>][<operator>]=<value>
Our API Reference for this filtering
Is there any hope for this being supported in the future or should we “move on”?
Five years later, this feature request is still relevant. Any news on this ?