Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenAPI query string parameter with list of objects

I am trying to document with OpenAPI a query string which look like

filtered[0][id]=code&filtered[0][value]=12345

and contains a list of object with properties id and value.

My yaml documentation looks like the following

parameters:
    - name: filtered
      in: query
      description: filters to be applied
      explode: true
      style: deepObject
      schema:
        type: array
        items:
          properties:
            id:
              description: name of the field to be filtered
              type: string
            value:
              description: value of the filter
          type: object

The problem is the following: it looks like the style: deepObject option works only for one level, and not at the second level where my objects actually are. That is, it expects a query string like

?sorted[0]=%7B%0A%20%20%22id%22%3A%20%22string%22%2C%0A%20%20%22value%22%3A%20true%0A%7D

with the object not serialized as an array with id and value keys.

Is there a way to solve this?

like image 662
marcosh Avatar asked Oct 19 '18 12:10

marcosh


People also ask

What is operationId in OpenAPI spec?

operationId is an optional unique string used to identify an operation. If provided, these IDs must be unique among all operations described in your API.

What is explode in OpenAPI?

explode (true/false) specifies whether arrays and objects should generate separate parameters for each array item or object property.


1 Answers

This is not possible as of OpenAPI 3.1

OpenAPI 3.0/3.1 Specifications currently defines the deepObject behavior only for simple objects (with primitive properties) such as

{
  "id": 5,
  "name": "Bob"
}

but not for arrays and not for nested objects.

Since the behavior for arrays and nested objects is not defined, there's really no way to describe your query string. Technically, the only way would be to define filtered[0][id], filtered[0][value], etc. as individual query parameters.


If you are designing a new API (rather than describing an existing one), consider passing the array of objects in the request body instead.
like image 132
Helen Avatar answered Sep 20 '22 13:09

Helen