2. OpenAPI 基础结构:核心对象与作用

OpenAPI 规范(原 Swagger 规范)是描述 RESTful API 的事实标准。一个合法的 OpenAPI 文档必须包含 openapi 字段,并在此基础上组织 info、servers、paths、components 等顶层对象。理解这五个基础结构,是编写可维护、可自动生成客户端与文档的 API 描述文件的前提。

2.1 openapi 字段:版本声明

openapi 字段位于文档根节点,用于声明所遵循的 OpenAPI 规范版本。该字段的值必须是语义化版本号(SemVer),例如 3.0.3 或 3.1.0。它是整个文档的入口标识,解析器据此决定如何解析后续对象。

关键约束: 该字段不可省略,且必须为有效版本号。OpenAPI 3.0.x 与 3.1.x 在 JSON Schema 引用方式上存在差异,生产环境中建议锁定具体次版本。
openapi: "3.0.3"
info:
  title: 订单服务 API
  version: "1.2.0"
servers:
  - url: https://api.example.com/v1
paths:
  /orders:
    get:
      summary: 获取订单列表
      responses:
        '200':
          description: 成功返回订单数组
components:
  schemas:
    Order:
      type: object
      properties:
        id:
          type: integer
        status:
          type: string

2.2 info 对象:元数据描述

info 对象提供 API 的元数据,包括标题、版本、描述、联系人信息和许可信息。该对象是文档的“身份牌”,在生成文档首页和 SDK 时被广泛使用。

字段名 类型 必填 说明
title string 是 API 的名称,如“用户管理 API”
version string 是 API 文档版本,与 API 实际版本同步
description string 否 对 API 的详细说明,支持 CommonMark 语法
contact Contact Object 否 维护团队联系方式(name/url/email)
license License Object 否 API 使用许可(name/url)
实践建议: 在微服务架构中,info.version 应与 Git 标签或 CI 构建号对齐,避免文档版本与代码版本脱节。

2.3 servers 对象:访问地址

servers 对象是一个数组,定义 API 的基 URL(Base URL)。每个服务器条目包含 url(必填)和 description(可选),支持变量模板(如 {environment})实现多环境切换。

servers:
  - url: https://api.prod.example.com/v2
    description: 生产环境
  - url: https://api.staging.example.com/v2
    description: 预发布环境
  - url: https://{subdomain}.example.com/{basePath}
    description: 动态环境
    variables:
      subdomain:
        default: api
        enum: [api, api-dev, api-test]
      basePath:
        default: v2

在 Kafka 堆积诊断场景中,servers 对象常用于区分不同集群的监控 API 入口,例如生产集群与沙箱集群使用不同的 URL 模板。

2.4 paths 对象:API 端点定义

paths 对象是 OpenAPI 文档的核心,以相对路径为键,映射到该路径上支持的 HTTP 方法(GET、POST、PUT、DELETE 等)。每个方法下可定义参数、请求体、响应、安全要求等。

  • 路径模板: 支持 {param} 占位符,如 /orders/{orderId}。
  • 操作对象: 每个 HTTP 方法对应一个 Operation Object,包含 summary、operationId、parameters、requestBody、responses。
  • 响应对象: 必须至少定义一个成功响应(通常为 200 或 201),推荐为每个错误码定义描述。
paths:
  /orders:
    get:
      operationId: listOrders
      summary: 分页查询订单
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
      responses:
        '200':
          description: 订单列表
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Order'
        '400':
          description: 参数错误
  /orders/{orderId}:
    get:
      operationId: getOrderById
      parameters:
        - name: orderId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 单个订单详情
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'

2.5 components 对象:可复用组件

components 对象是 OpenAPI 的“工具箱”,用于定义可复用的 Schema、参数、响应、请求体、安全方案等。通过 $ref 引用,避免在多个路径中重复定义相同结构。

子对象 用途 常见场景
schemas 数据模型定义(JSON Schema) Order、User、ErrorResponse 等实体
parameters 可复用的路径/查询/头参数 分页参数、时间范围参数
responses 可复用的响应结构 通用错误响应、分页响应
requestBodies 可复用的请求体结构 创建订单请求体、批量更新请求体
securitySchemes 认证方案定义 Bearer Token、API Key、OAuth2
常见陷阱: $ref 引用不能与同层级其他字段混用。例如 schema: { $ref: '#/components/schemas/Order', description: '订单对象' } 在 OpenAPI 3.0 中是非法的,必须将 description 放在外层。

2.6 五对象关系总览

以下 SVG 图展示了 OpenAPI 文档顶层五个对象之间的依赖与引用关系,帮助理解它们在文档中的位置与协作方式。

OpenAPI 五对象关系图 OpenAPI 文档顶层对象关系 openapi: "3.0.3" info 对象 servers 对象 paths 对象 components 对象 说明: • openapi 字段声明版本,是文档的根标识。 • info、servers、paths 为顶层必选/常用对象;components 为可选但强烈推荐。 • paths 中的操作可通过 $ref 引用 components 中的 schemas、parameters 等。

2.7 工程实践要点

  • 版本对齐: 始终在 info.version 中记录 API 文档版本,并通过 CI 流水线确保与代码版本一致。
  • 服务器模板化: 使用 servers.variables 实现多环境切换,避免手动修改 URL。
  • 路径设计: 路径参数使用 {param} 占位符,查询参数在 parameters 中定义,避免硬编码。
  • 组件复用: 将通用 Schema(如分页响应、错误结构)放入 components.schemas,减少重复代码。
  • Kafka 集成: 在监控 API 的 OpenAPI 文档中,使用 components.schemas 定义 ConsumerGroup、TopicPartition、Lag 等模型,便于生成客户端 SDK。
Kafka 堆积诊断场景示例: 在描述 Kafka 集群监控 API 时,paths 下可定义 /consumer-groups/{groupId}/lags 端点,其响应 Schema 引用 components.schemas.ConsumerLag,该 Schema 包含 topic、partition、currentOffset、logEndOffset、lag 五个字段。这种结构化的定义方式,使得 API 消费者可以自动生成类型安全的客户端代码。