profile
viewpoint

Ask questionsArbitrary query parameter names?

I'm pretty new to openapi, so apologies if this has been asked before. I haven't been able to find a similar question anywhere.

I'm working creating an openapi.yml for an existing API we have at my workplace.

For better or worse, the API supports arbitrary query parameter names. Values are always supplied. These pairs are interpreted as tag name/value pairs of particular resources (computational resources). Here are a few examples (with some name simplifications) of how the API can be invoked:

GET /resources?state=active&tagName1=tagValue1&tagName2=tagValue2

GET /resources?tagName6=tagValue6

GET /resources?state=active

Both the tagNameNs and tagValueN's are user-supplied and arbitrary, but have to conform to be "identifier names" (no spaces, alphanumeric, must not start with a digit).

The only query parameter with a fixed, known name is state.

Is there some way of expressing this notion in openapi?

I appreciate this is pretty unusual, and perhaps the description might be the only means to express this.

For reference here's a section of my openapi.yml file for this endpoint.

openapi: 3.0.0
info:
  title: Service
  description: Endpoints
  version: 1.0.0
paths:
  /resources:
    get:
      parameters:
        - in: query
          name: state
          schema:
            type: string
            enum:
              - active
              - inactive
        - in: query
         # TODO - how to describe tagNameN/tagValueN here?
      responses:
        '200':
          description: "All resources successfully obtained."

Any insights or advice appreciated.

Thanks in advance.

OAI/OpenAPI-Specification

Answer questions hkosova

@danieljacobs1 Free-form query parameters can be defined as a single parameter whose value is a dictionary and that uses style: form + explode: true (this is the default serialization style for query parameters). The parameter name can be arbitrary, it does not appear in the URL but may be used by code generators.

Both the tagNameNs and tagValueN's are user-supplied and arbitrary, but have to conform to be "identifier names" (no spaces, alphanumeric, must not start with a digit).

The name format can be defined in OAS 3.1 using patternProperties or propertyNames. Make sure to use the ^ and $ anchors in regexes because regexes are not implicitly anchored.

patternProperties example:

        - in: query
          name: tags  # Arbitrary name
          schema:
            type: object
            patternProperties:
              # Parameter names
              '^[A-Za-z][A-Za-z0-9]*$':
                # Parameter values
                type: string
                pattern: '^[A-Za-z][A-Za-z0-9]*$'
            additionalProperties: false
            example:
              tagName1: tagValue1
              tagName2: tagValue2

propertyNames example:

        - in: query
          name: tags  # Arbitrary name
          schema:
            type: object
            propertyNames:
              pattern: '^[A-Za-z][A-Za-z0-9]*$'  # Parameter names
            additionalProperties:     # Schema for parameter values
              type: string
              pattern: '^[A-Za-z][A-Za-z0-9]*$'
            example:
              tagName1: tagValue1
              tagName2: tagValue2

<br/>

OAS 3.0 also supports free-form query parameters, but does not have a way to limit their names.

        - in: query
          name: tags  # Arbitrary name
          schema:
            type: object
            additionalProperties:  # Schema for parameter values
              type: string
              pattern: '^[A-Za-z][A-Za-z0-9]*$'
            example:
              tagName1: tagValue1
              tagName2: tagValue2
useful!
source:https://uonfu.com/
Github User Rank List