4. 参数详解:路径参数、查询参数、请求头参数、Cookie参数的定义方式、必需性与默认值、参数序列化规则
在OpenAPI 3.0规范中,API参数是接口契约的核心组成部分。本章将系统讲解四种常见参数类型(路径参数、查询参数、请求头参数、Cookie参数)的完整定义方式,包括必需性控制、默认值设置以及关键的序列化规则。理解这些细节是构建可读、可测试、可自动生成客户端代码的API规范的基础。
4.1 参数定义的核心结构
所有参数在OpenAPI规范中共享一个统一的描述结构,通过 in 字段区分参数类型。以下是参数对象的通用字段表:
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
| name | string | 是 | 参数名称,区分大小写 |
| in | string | 是 | 参数位置:path、query、header、cookie |
| required | boolean | 否 | 是否必需,默认 false;路径参数必须为 true |
| description | string | 否 | 参数说明,建议始终提供 |
| schema | Schema Object | 否 | 参数的数据类型与约束定义 |
| example | any | 否 | 单个示例值 |
| examples | Map[string, Example Object] | 否 | 多个示例,用于不同场景 |
| style | string | 否 | 序列化样式,决定多值参数如何编码 |
| explode | boolean | 否 | 是否展开对象/数组为独立键值对,默认与 style 相关 |
| allowEmptyValue | boolean | 否 | 是否允许空字符串值,默认 false |
| deprecated | boolean | 否 | 标记参数已废弃 |
in: path)的 required 字段必须显式设置为 true,这是OpenAPI规范的硬性要求。如果遗漏,大多数验证工具会报错。
4.2 四种参数类型的定义方式
4.2.1 路径参数 (Path Parameters)
路径参数嵌入在URL路径模板中,用花括号 {} 标识。它们用于标识具体资源,如用户ID、订单号等。
paths:
/users/{userId}/orders/{orderId}:
get:
parameters:
- name: userId
in: path
required: true
description: 用户唯一标识
schema:
type: integer
format: int64
minimum: 1
- name: orderId
in: path
required: true
description: 订单唯一标识
schema:
type: string
pattern: '^ORD-\d{8}$'
responses:
'200':
description: 订单详情
4.2.2 查询参数 (Query Parameters)
查询参数附加在URL的 ? 之后,用于过滤、排序、分页等非资源标识的场景。它们通常不是必需的。
parameters:
- name: page
in: query
required: false
description: 页码,从1开始
schema:
type: integer
default: 1
minimum: 1
- name: limit
in: query
required: false
description: 每页条数
schema:
type: integer
default: 20
maximum: 100
- name: status
in: query
required: false
description: 按状态过滤
schema:
type: string
enum: [active, paused, completed, cancelled]
4.2.3 请求头参数 (Header Parameters)
请求头参数携带在HTTP头部,常用于认证令牌、内容协商、请求追踪等元数据。注意:Accept、Content-Type、Authorization 等标准头通常不在 parameters 中定义,而是使用OpenAPI的专用字段。
parameters:
- name: X-Request-Id
in: header
required: false
description: 请求追踪ID,用于分布式链路追踪
schema:
type: string
format: uuid
- name: X-API-Version
in: header
required: true
description: API版本号
schema:
type: string
pattern: '^\d+\.\d+$'
example: "1.2"
4.2.4 Cookie参数 (Cookie Parameters)
Cookie参数从HTTP Cookie头中提取。与请求头参数不同,Cookie参数专门用于会话标识、用户偏好等持久化在客户端的键值对。
parameters:
- name: session_id
in: cookie
required: true
description: 用户会话标识
schema:
type: string
format: uuid
- name: preferred_lang
in: cookie
required: false
description: 用户偏好语言
schema:
type: string
default: "zh-CN"
enum: [zh-CN, en-US, ja-JP]
allowEmptyValue 字段。此外,由于Cookie的存储容量限制(通常4KB),不建议在Cookie参数中传递大量数据。
4.3 必需性与默认值
必需性(required)和默认值(default)是参数定义中两个容易混淆但又紧密相关的概念:
| 场景 | required | default | 客户端行为 | 服务端处理 |
|---|---|---|---|---|
| 必传参数 | true |
无 | 必须提供值 | 缺少时返回400 |
| 可选参数+默认值 | false |
有 | 可省略 | 使用默认值 |
| 可选参数+无默认值 | false |
无 | 可省略 | 按 null 或未定义处理 |
| 必传参数+默认值 | true |
有 | 必须提供,但可用默认值 | 客户端传值时覆盖默认值 |
default 字段。这不仅能减少客户端代码的冗余,还能在API文档中清晰展示默认行为。例如,page 默认1,limit 默认20。
4.4 参数序列化规则
序列化规则决定了当参数是数组或对象时,如何在URL、请求头或Cookie中编码。这是OpenAPI规范中最容易被忽视但影响客户端代码生成质量的部分。
4.4.1 style 与 explode 的交互
每个参数位置都有默认的 style 值,explode 控制是否将对象/数组展开为独立键值对:
| 参数位置 (in) | 默认 style | style 可选值 | explode 默认值 |
|---|---|---|---|
| path | simple | simple, label, matrix | false |
| query | form | form, spaceDelimited, pipeDelimited, deepObject | true |
| header | simple | simple | false |
| cookie | form | form | true |
4.4.2 常见序列化示例
假设有一个数组参数 tags,值为 ["java", "openapi", "kafka"],不同序列化方式的结果如下:
| style | explode | 编码结果 | 适用位置 |
|---|---|---|---|
| form | true | tags=java&tags=openapi&tags=kafka |
query, cookie |
| form | false | tags=java,openapi,kafka |
query, cookie |
| spaceDelimited | false | tags=java%20openapi%20kafka |
query |
| pipeDelimited | false | tags=java|openapi|kafka |
query |
| simple | false | java,openapi,kafka |
path, header |
| label | false | .java.openapi.kafka |
path |
| matrix | false | ;tags=java,openapi,kafka |
path |
4.4.3 对象参数的序列化
对于对象参数,explode 的影响更为显著。以 filter 对象 {"type": "book", "price": 29.9} 为例:
# form + explode: true (query参数默认)
filter[type]=book&filter[price]=29.9
# form + explode: false
filter=type,book,price,29.9
# deepObject (仅query支持)
filter[type]=book&filter[price]=29.9
style: form, explode: true(默认值),因为这种格式被大多数HTTP框架原生支持,且可读性最好。对于路径参数中的数组,保持默认的 style: simple, explode: false。
4.5 参数定义完整示例
以下是一个综合了四种参数类型的OpenAPI片段,展示了一个带分页、过滤、认证和会话追踪的订单查询接口:
paths:
/api/v1/orders:
get:
operationId: listOrders
parameters:
# 查询参数 - 分页
- name: page
in: query
required: false
schema:
type: integer
default: 1
minimum: 1
- name: limit
in: query
required: false
schema:
type: integer
default: 20
maximum: 100
# 查询参数 - 过滤(数组,form+explode)
- name: status
in: query
required: false
schema:
type: array
items:
type: string
enum: [pending, confirmed, shipped, delivered]
style: form
explode: true
# 请求头参数 - 认证令牌
- name: Authorization
in: header
required: true
schema:
type: string
pattern: '^Bearer\s.+'
description: Bearer令牌
# 请求头参数 - 请求追踪
- name: X-Trace-Id
in: header
required: false
schema:
type: string
format: uuid
# Cookie参数 - 会话
- name: session_token
in: cookie
required: true
schema:
type: string
responses:
'200':
description: 订单列表
- 路径参数始终
required: true,且名称必须与路径模板中的{}占位符完全一致。 - 查询参数的
default值应谨慎选择,避免与业务逻辑冲突(如分页从0开始还是从1开始)。 - 请求头参数名称应遵循HTTP规范,使用连字符分隔(如
X-Request-Id),避免使用下划线。 - Cookie参数通常用于会话管理,建议配合
format: uuid或pattern约束增强安全性。 - 序列化规则在代码生成工具(如OpenAPI Generator)中直接影响客户端调用代码的生成质量,务必显式声明而非依赖默认值。