2. OpenAPI 文档结构:文档顶层结构解析

OpenAPI 3.x 规范定义了一套标准化的顶层结构,用于描述整个 API 的元数据、连接信息、路径、组件复用以及文档扩展。理解这 7 个顶层字段是编写、解析和维护 OpenAPI 文档的基础。

2.1 顶层字段总览

一个合法的 OpenAPI 文档必须包含 openapi 和 info 字段,其余字段按需声明。下表列出了所有顶层字段及其用途:

字段名 必需 类型 核心用途
openapi 是 string 声明规范版本号,如 3.0.3 或 3.1.0
info 是 Info Object API 标题、版本、描述、联系人、许可信息
servers 否 [Server Object] API 的基础 URL 列表,支持变量模板
paths 否 Paths Object 所有 API 端点及其操作(GET/POST 等)
components 否 Components Object 可复用的 schema、参数、响应、安全方案等
tags 否 [Tag Object] 对路径进行逻辑分组,用于文档导航
externalDocs 否 External Documentation Object 指向外部文档的链接,如业务说明或 SDK 指南
合规提示: 在安全合规场景中,servers 字段必须显式声明生产环境与沙箱环境的 URL,禁止使用通配符或未校验的变量模板,防止 SSRF 攻击。

2.2 顶层结构关系图

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

OpenAPI 文档顶层结构 OpenAPI 文档根对象 openapi (版本) info (元信息) servers (服务器) paths (路径) components (组件) tags (标签) externalDocs (外部文档) 必需字段 核心功能 复用/扩展 说明 paths 和 components 是文档体量最大的两个字段。 tags 用于生成 API 目录分组,externalDocs 用于关联业务规范或 SDK 文档。

2.3 各字段详解

2.3.1 openapi — 规范版本声明

该字段的值必须是语义化版本号,目前主流版本为 3.0.3 和 3.1.0。版本决定了文档解析器的行为。

openapi: "3.0.3"

2.3.2 info — API 元信息

包含标题、描述、版本号、联系人及许可信息。在合规审计中,contact 字段必须填写真实团队邮箱。

info:
  title: 支付网关 API
  description: 提供订单创建、退款、对账等核心支付能力
  version: "2.1.0"
  contact:
    name: API 支持团队
    email: api-support@example.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0

2.3.3 servers — 服务器连接信息

支持多环境配置与变量模板。生产环境与沙箱环境必须分开声明。

servers:
  - url: https://api.example.com/v2
    description: 生产环境
  - url: https://sandbox-api.example.com/v2
    description: 沙箱测试环境
  - url: https://{env}-api.example.com/{version}
    description: 模板化环境
    variables:
      env:
        default: prod
        enum: [prod, sandbox, staging]
      version:
        default: v2
安全合规警告: 禁止在 servers 中使用用户可控制的变量模板指向内网地址(如 10.0.0.1),否则可能被 SSRF 攻击利用。建议对 enum 做白名单校验。

2.3.4 paths — 路径与操作

文档的核心部分,定义每个端点的请求方法、参数、请求体、响应及安全要求。路径支持参数化模板。

paths:
  /orders:
    get:
      summary: 查询订单列表
      parameters:
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: 成功返回订单列表
    post:
      summary: 创建订单
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderRequest'
      responses:
        '201':
          description: 订单创建成功

2.3.5 components — 可复用组件

集中管理 schemas、parameters、responses、securitySchemes 等,通过 $ref 引用。减少重复,提升文档一致性。

components:
  schemas:
    Order:
      type: object
      properties:
        id:
          type: integer
        amount:
          type: number
          format: float
        status:
          type: string
          enum: [pending, paid, cancelled]
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

2.3.6 tags — 逻辑分组标签

用于对 paths 中的操作进行分组,在生成的文档中形成目录结构。每个标签可以附带描述。

tags:
  - name: 订单
    description: 订单创建、查询、退款相关接口
  - name: 支付
    description: 支付渠道、回调、对账相关接口

2.3.7 externalDocs — 外部文档链接

指向业务需求文档、SDK 使用指南或合规政策文件。

externalDocs:
  description: 支付业务需求文档 v3.2
  url: https://wiki.example.com/payment/requirements

2.4 完整最小示例

以下是一个符合 OpenAPI 3.0.3 规范的最小文档骨架:

openapi: "3.0.3"
info:
  title: 最小示例 API
  version: "1.0.0"
servers:
  - url: https://api.example.com/v1
paths:
  /health:
    get:
      responses:
        '200':
          description: 服务正常
components: {}
tags:
  - name: 系统
externalDocs:
  description: 运维手册
  url: https://ops.example.com

2.5 字段依赖与常见错误

错误场景 原因 合规影响
缺少 openapi 字段 解析器无法确定规范版本 文档不可用,工具链报错
info.version 与 API 实际版本不一致 版本管理混乱 审计追溯失败
servers 未声明沙箱环境 测试与生产混用 安全合规不通过
paths 中直接内嵌复杂 schema 而不使用 $ref 组件未复用 文档膨胀,维护成本高
tags 未定义但路径中使用了 tags 引用 标签引用断裂 文档生成工具可能忽略分组
最佳实践: 在 CI/CD 流水线中加入 OpenAPI 文档校验步骤(如使用 swagger-cli validate 或 redocly lint),确保每次提交都符合顶层结构规范。