2. OpenAPI 规范基础:发展史、版本对比与核心文件结构

OpenAPI 规范(原 Swagger 规范)是业界描述 RESTful API 的事实标准。理解其演进脉络、版本差异和文件骨架,是实施契约驱动 API 设计治理的第一步。本章从发展史切入,对比 Swagger 2.0、OpenAPI 3.0 和 3.1 的核心变化,并拆解一个标准 OpenAPI 文档的顶层结构。

2.1 发展史:从 Swagger 到 OpenAPI

OpenAPI 规范的演进经历了三个关键阶段:

阶段 时间 关键事件
Swagger 诞生 2011 Wordnik 公司发布 Swagger 规范,用于描述 REST API
Swagger 2.0 2014 Swagger 2.0 成为最广泛使用的 API 描述格式,被 Reverb、Apigee 等公司采用
捐赠与标准化 2015 Swagger 规范捐赠给 Linux 基金会,更名为 OpenAPI 规范(OAS)
OpenAPI 3.0 2017 OAS 3.0 发布,引入独立 components、增强请求体描述、改进回调
OpenAPI 3.1 2021 OAS 3.1 发布,全面对齐 JSON Schema 2020-12,支持 Webhook、路径参数增强
关键认知: Swagger 2.0 是“事实标准”,OpenAPI 3.0 是“行业标准”,OpenAPI 3.1 是“未来标准”。新项目应优先采用 3.1,存量项目可逐步迁移。

2.2 版本对比:Swagger 2.0 vs OpenAPI 3.0 vs OpenAPI 3.1

三个版本在核心概念、文件结构、JSON Schema 支持等方面存在显著差异。下表从 API 设计治理视角进行对比:

对比维度 Swagger 2.0 OpenAPI 3.0 OpenAPI 3.1
根字段 swagger: "2.0" openapi: "3.0.x" openapi: "3.1.x"
JSON Schema 版本 自定义子集(非标准 JSON Schema) JSON Schema Draft 07 子集 JSON Schema 2020-12(完整支持)
请求体描述 通过 body 参数 + in: body 独立 requestBody 对象 同 3.0,增强 content 描述
组件复用 definitions、parameters、responses 分散 统一 components 对象 同 3.0,增加 pathItems 复用
回调(Callback) 不支持 支持 callbacks 对象 同 3.0,增强路径模板
Webhook 不支持 不支持 支持顶层 webhooks 字段
路径参数 仅支持 path 参数 支持 path、query、header、cookie 同 3.0,支持 style、explode 增强
安全方案 securityDefinitions components/securitySchemes 同 3.0,支持 OAuth 2.0 增强
示例 仅 example 单值 支持 examples 多示例 同 3.0,增强媒体类型示例
迁移建议: 从 Swagger 2.0 迁移到 OpenAPI 3.0/3.1 时,重点关注:
1) 将 definitions 改为 components/schemas;
2) 将 body 参数改为 requestBody;
3) 将 securityDefinitions 改为 components/securitySchemes;
4) 检查 JSON Schema 兼容性(3.1 需适配 2020-12 语法)。

2.3 核心文件结构

一个标准的 OpenAPI 3.1 文档由以下顶层字段构成。理解这些字段的职责和层级关系,是编写可维护 API 契约的基础。

openapi: "3.1.0"                # 规范版本号
info:                           # API 元信息
  title: 用户管理API
  version: "1.0.0"
  description: 提供用户注册、登录、信息查询等接口
servers:                        # 服务器地址列表
  - url: https://api.example.com/v1
    description: 生产环境
paths:                          # 路径与操作定义
  /users:
    get:
      summary: 获取用户列表
      operationId: listUsers
      parameters:
        - name: page
          in: query
          schema:
            type: integer
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserList"
webhooks:                       # Webhook 定义(3.1 新增)
  newUser:
    post:
      summary: 新用户注册通知
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/User"
components:                     # 可复用组件
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
    UserList:
      type: array
      items:
        $ref: "#/components/schemas/User"
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
security:                       # 全局安全要求
  - bearerAuth: []
tags:                           # 标签分组
  - name: 用户
    description: 用户相关接口
externalDocs:                   # 外部文档
  description: 完整API文档
  url: https://docs.example.com/api
常见陷阱: 不要将 paths 中的操作定义得过于冗长。建议将复杂 schema 抽取到 components/schemas 中,通过 $ref 引用,保持路径定义简洁、可读。

2.4 文件结构关系图

下图展示了 OpenAPI 3.1 文档的顶层字段及其逻辑关系:

OpenAPI 3.1 核心文件结构 OpenAPI 文档根 openapi info servers paths webhooks components security tags schemas responses parameters securitySchemes 说明: • openapi:声明规范版本,3.1.x 表示使用 OpenAPI 3.1 • info:API 元信息,包括标题、版本、描述 • paths:核心路径定义,每个路径包含多个 HTTP 方法操作 • components:可复用组件,通过 $ref 引用,减少重复定义

2.5 版本选择决策树

在实际项目中,如何选择 OpenAPI 版本?以下决策树可辅助判断:

OpenAPI 版本选择决策树 选择 OpenAPI 版本 需要 JSON Schema 2020-12? 需要 Webhook 支持? OpenAPI 3.1 OpenAPI 3.0 OpenAPI 3.1 决策说明: • 如果项目需要完整的 JSON Schema 2020-12 支持(如 $defs、unevaluatedProperties),选 3.1 • 如果项目需要 Webhook 描述能力,选 3.1(3.0 不支持) • 如果项目依赖现有工具链(如 Swagger UI 旧版),且不需要 3.1 新特性,可暂用 3.0 • 新项目建议直接采用 OpenAPI 3.1,避免后续迁移成本

2.6 实践要点

  • 版本声明必须准确: openapi: "3.1.0" 中的版本号必须与规范实际版本一致,否则工具链可能解析失败。
  • 优先使用 $ref 复用: 将重复的 schema、参数、响应定义抽取到 components 中,通过 $ref 引用,降低维护成本。
  • 路径参数风格统一: 在 OpenAPI 3.x 中,路径参数支持 style 和 explode 属性,建议团队约定统一风格(如 simple + false)。
  • 示例驱动设计: 利用 examples 字段提供多场景示例,帮助消费者理解 API 行为。
  • 安全方案集中管理: 在 components/securitySchemes 中定义所有安全方案,路径级别通过 security 字段引用。
治理检查点: 在 API 设计评审中,应检查:
1) 是否使用了正确的 OpenAPI 版本;
2) 是否将可复用组件抽取到 components;
3) 是否提供了足够的示例和描述;
4) 路径参数风格是否统一;
5) 安全方案是否完整且正确引用。