You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This allows treating the entire query string as a single parameter,
which for `application/x-www-form-urlencoded` results in it being
handled exactly as request bodies of that media type are handled.
Only one `in: "querystring"` is allowed per operation, and if it
is present, no `in: "query"` parameters are allowed.
The `content` field MUST be used for `in: "querystring"`, as the
`style` and related fields are handled in the Encoding Object.
This also includes a recommendation that implementors design
media types for complex query string formats such as those defined
by various frameworks, and register a procedure for supporting
them in our media type registry. This is intended to address
a slow but steady trickle of requests to support various complex
and often contradictory query string formats.
Copy file name to clipboardExpand all lines: src/oas.md
+51-3Lines changed: 51 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -905,7 +905,8 @@ See [Appendix E](#appendix-e-percent-encoding-and-form-media-types) for a detail
905
905
There are four possible parameter locations specified by the `in` field:
906
906
907
907
* path - Used together with [Path Templating](#path-templating), where the parameter value is actually part of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, the path parameter is `itemId`.
908
-
* query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`.
908
+
* query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`; MUST NOT appear in the same operation as an `in: "querystring"` parameter.
909
+
* querystring - A parameter that treats the entire URL query string as a value which MUST be specified using the `content` field, most often with media type `application/x-www-form-urlencoded` using [Encoding Objects](#encoding-object) in the same way as with request bodies of that media type; MUST NOT appear more than once, and MUST NOT appear in the same operation with any `in: "query"` parameters.
909
910
* header - Custom headers that are expected as part of the request. Note that [RFC9110](https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1) states header names are case insensitive.
910
911
* cookie - Used to pass a specific cookie value to the API.
911
912
@@ -921,8 +922,8 @@ These fields MAY be used with either `content` or `schema`.
921
922
922
923
| Field Name | Type | Description |
923
924
| ---- | :----: | ---- |
924
-
| <a name="parameter-name"></a>name | `string` | **REQUIRED**. The name of the parameter. Parameter names are _case sensitive_. <ul><li>If [`in`](#parameter-in) is `"path"`, the `name` field MUST correspond to a template expression occurring within the [path](#paths-path) field in the [Paths Object](#paths-object). See [Path Templating](#path-templating) for further information.<li>If [`in`](#parameter-in) is `"header"` and the `name` field is `"Accept"`, `"Content-Type"` or `"Authorization"`, the parameter definition SHALL be ignored.<li>For all other cases, the `name` corresponds to the parameter name used by the [`in`](#parameter-in) field.</ul> |
925
-
| <a name="parameter-in"></a>in | `string` | **REQUIRED**. The location of the parameter. Possible values are `"query"`, `"header"`, `"path"` or `"cookie"`. |
925
+
| <a name="parameter-name"></a>name | `string` | **REQUIRED**. The name of the parameter. Parameter names are _case sensitive_. <ul><li>If [`in`](#parameter-in) is `"path"`, the `name` field MUST correspond to a template expression occurring within the [path](#paths-path) field in the [Paths Object](#paths-object). See [Path Templating](#path-templating) for further information.<li>If [`in`](#parameter-in) is `"header"` and the `name` field is `"Accept"`, `"Content-Type"` or `"Authorization"`, the parameter definition SHALL be ignored.<li>If `in` is `"querystring"`, or for [certain combinations](#style-examples) of [`style`](#parameter-style) and [`explode`](#parameter-explode), the value of `name` is not used in the parameter serialization.<li>For all other cases, the `name` corresponds to the parameter name used by the [`in`](#parameter-in) field.</ul> |
926
+
| <a name="parameter-in"></a>in | `string` | **REQUIRED**. The location of the parameter. Possible values are `"query"`, `"querystring"`, `"header"`, `"path"` or `"cookie"`. |
926
927
| <a name="parameter-description"></a>description | `string` | A brief description of the parameter. This could contain examples of use. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. |
927
928
| <a name="parameter-required"></a>required | `boolean` | Determines whether this parameter is mandatory. If the [parameter location](#parameter-in) is `"path"`, this field is **REQUIRED** and its value MUST be `true`. Otherwise, the field MAY be included and its default value is `false`. |
928
929
| <a name="parameter-deprecated"></a> deprecated | `boolean` | Specifies that a parameter is deprecated and SHOULD be transitioned out of usage. Default value is `false`. |
@@ -938,6 +939,8 @@ For simpler scenarios, a [`schema`](#parameter-schema) and [`style`](#parameter-
938
939
When `example` or `examples` are provided in conjunction with the `schema` field, the example SHOULD match the specified schema and follow the prescribed serialization strategy for the parameter.
939
940
The `example` and `examples` fields are mutually exclusive, and if either is present it SHALL _override_ any `example` in the schema.
940
941
942
+
These fields MUST NOT be used with `in: "querystring"`.
943
+
941
944
Serializing with `schema` is NOT RECOMMENDED for `in: "cookie"` parameters, `in: "header"` parameters that use HTTP header parameters (name=value pairs following a `;`) in their values, or `in: "header"` parameters where values might have non-URL-safe characters; see [Appendix D](#appendix-d-serializing-headers-and-cookies) for details.
942
945
943
946
| Field Name | Type | Description |
@@ -956,6 +959,8 @@ See also [Appendix C: Using RFC6570-Based Serialization](#appendix-c-using-rfc65
956
959
For more complex scenarios, the [`content`](#parameter-content) field can define the media type and schema of the parameter, as well as give examples of its use.
957
960
Using `content` with a `text/plain` media type is RECOMMENDED for `in: "header"` and `in: "cookie"` parameters where the `schema` strategy is not appropriate.
958
961
962
+
For use with `in: "querystring"` and `application/x-www-form-urlencoded`, see [Encoding the `x-www-form-urlencoded` Media Type](#encoding-the-x-www-form-urlencoded-media-type).
963
+
959
964
| Field Name | Type | Description |
960
965
| ---- | :----: | ---- |
961
966
| <a name="parameter-content"></a>content | Map[`string`, [Media Type Object](#media-type-object)] | A map containing the representations for the parameter. The key is the media type and the value describes it. The map MUST only contain one entry. |
@@ -1012,6 +1017,16 @@ The following table shows examples, as would be shown with the `example` or `exa
Many frameworks define query string syntax for complex values, such as appending array indices to parameter names or indicating multiple levels of of nested objects, which go well beyond the capabilities of the `deepObject` style.
1023
+
1024
+
As these are not standards, and often contradict each other, the OAS does not attempt to support them directly.
1025
+
Two avenues are available for supporting such formats with `in: querystring`:
1026
+
1027
+
* Use `content` and `text/plain` with a schema of `type: string` and define the format outside of OpenAPI. While this requires more work to document and construct or parse the format, which is seen as a plain string from the OpenAPI perspective, it provides the easiest flexible option
1028
+
* Define a media type (which need not necessarily be [IANA-registered](https://www.rfc-editor.org/rfc/rfc6838.html)) and submit a registration for how it can be supported (using `in: "querystring"` and the `content` field) to the OpenAPI Initiative's [Media Type Registry](#media-type-registry).
1029
+
1015
1030
##### Parameter Object Examples
1016
1031
1017
1032
A header parameter with an array of 64-bit integer numbers:
@@ -1086,6 +1101,39 @@ content:
1086
1101
type: number
1087
1102
```
1088
1103
1104
+
A querystring parameter that uses JSON for the entire string (not as a single query parameter value):
1105
+
1106
+
```yaml
1107
+
in: querystring
1108
+
name: json
1109
+
content:
1110
+
application/json:
1111
+
schema:
1112
+
# Allow an arbitrary JSON object to keep
1113
+
# the example simple
1114
+
type: object
1115
+
```
1116
+
1117
+
A querystring parameter that uses JSONPath:
1118
+
1119
+
```yaml
1120
+
in: querystring
1121
+
name: sql
1122
+
content:
1123
+
application/jsonpath:
1124
+
schema:
1125
+
type: string
1126
+
example: $.a.b[1:1]
1127
+
```
1128
+
1129
+
As there is not currently a defined mapping between the JSON Schema data model and JSONPath, the details of the string's allowed structure would need to be conveyed either in a human-readable `description` field, or through a mechanism outside of the OpenAPI Description, such as a JSON Schema for the data structure to be queried.
1130
+
1131
+
Assuming a path of `/foo` and a server of `https://example.com`, the full URL incorporateing the value from the `example` field would be:
0 commit comments