4. 接口文档与规范:OpenAPI/Swagger 规范介绍、YAML 与 JSON 格式定义、Swagger Editor 使用

说实话,我见过太多团队因为接口文档问题吵得不可开交。前端说后端接口改了没通知,后端说文档写了你自己不看。这种扯皮,说白了就是缺一套统一的规范。

我在 2016 年刚接触微服务时,就被 Swagger 这套东西救过命。当时我们团队 8 个人维护 20 多个服务,接口文档全靠 Word 和 Wiki 维护。嗯,你想想看,每次联调前光对接口字段就要花半天。后来全面切到 OpenAPI 规范,配合 Swagger UI 自动生成文档,效率提升不是一星半点。

4.1 什么是 OpenAPI / Swagger 规范

OpenAPI 规范(原名 Swagger 规范)是一套用于描述 RESTful API 的标准化格式。它不关心你用什么语言、什么框架,只关心你的接口长什么样——有哪些路径、接收什么参数、返回什么结构。

我个人习惯把 OpenAPI 理解成「接口的身份证」。有了它,前端可以自动生成请求代码,后端可以自动生成文档页面,测试工具可以自动构造请求参数。整个开发链条都围绕同一份规范运转,谁也别想偷懒。

核心概念速览:

  • OpenAPI:规范本身,目前最新是 3.1.0 版本
  • Swagger:实现该规范的工具集(Swagger UI、Swagger Editor、Swagger Codegen)
  • Swagger UI:根据规范自动生成的可交互文档页面
  • Swagger Editor:在线编写和预览规范的编辑器

我记得有一次接手一个老项目,接口文档散落在三个不同的 Confluence 页面里,有的字段名还对不上。我花了一整天把所有接口整理成 OpenAPI 规范,然后直接用 Swagger Codegen 生成了 Java 客户端代码。那感觉,就像把一堆乱麻理成了整齐的线团。

4.2 YAML 与 JSON 格式定义

OpenAPI 规范支持两种序列化格式:YAML 和 JSON。我个人更偏爱 YAML,原因很简单——可读性强,写起来快,而且天然支持注释。

你想想看,JSON 写复杂嵌套结构时,大括号小括号满天飞,少一个逗号整个文件就崩了。YAML 用缩进表示层级,清爽得多。

4.2.1 一个简单的对比

下面用两种格式描述同一个接口:

JSON 版本:

{
  "openapi": "3.0.0",
  "info": {
    "title": "用户服务 API",
    "version": "1.0.0",
    "description": "提供用户注册、登录、信息查询功能"
  },
  "paths": {
    "/users/{id}": {
      "get": {
        "summary": "根据 ID 获取用户信息",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "成功返回用户对象",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          }
        }
      }
    }
  }
}

YAML 版本:

openapi: "3.0.0"
info:
  title: 用户服务 API
  version: "1.0.0"
  description: 提供用户注册、登录、信息查询功能

paths:
  /users/{id}:
    get:
      summary: 根据 ID 获取用户信息
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: 成功返回用户对象
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        email:
          type: string
          format: email

看出来了吧?YAML 少了大量引号和逗号,结构一目了然。我在项目中一直用 YAML 写规范,只有在需要程序化处理时才转成 JSON。

我的小技巧:写 YAML 时注意缩进必须一致,要么全用空格,要么全用 Tab。我习惯用 2 个空格缩进,团队里统一约定好就行。另外,YAML 里字符串可以不加引号,但如果包含特殊字符(如冒号、井号),最好用双引号包起来。

4.2.2 核心字段说明

字段 说明 是否必填
openapi 规范版本号,如 "3.0.0" 或 "3.1.0" 是
info API 的元信息,包括标题、版本、描述 是
servers API 的基础 URL 列表,可配置多个环境 否
paths 所有接口路径的定义,核心部分 是
components 可复用的数据模型、参数、响应等 否
tags 接口分组标签,方便文档分类展示 否

4.3 Swagger Editor 使用

Swagger Editor 是一个在线编辑器,你可以在浏览器里直接编写 OpenAPI 规范,左边写代码,右边实时预览文档效果。

我记得第一次用的时候,右边那个漂亮的交互式文档页面让我眼前一亮——每个接口都可以直接点击「Try it out」按钮,输入参数就能发真实请求。这对前后端联调来说太方便了。

4.3.1 三种使用方式

  1. 在线版(推荐新手):访问 editor.swagger.io,直接开写,无需安装
  2. Docker 本地部署:docker pull swaggerapi/swagger-editor,适合内网环境
  3. VS Code 插件:搜索 Swagger Viewer,在 IDE 里预览

我曾经踩过的坑:在线版编辑器虽然方便,但你的规范文件会传到 Swagger 的服务器。如果项目涉及敏感信息(如内网地址、测试账号),建议用 Docker 本地部署。我们团队就因为这个原因,统一在内部服务器上搭了一个 Swagger Editor 实例。

4.3.2 编辑器核心功能

  • 实时校验:写错字段或格式不对,左侧会标红提示
  • 自动补全:输入 openapi: 后自动提示版本号
  • 代码生成:支持生成 Java、Python、Go 等语言的客户端代码
  • 导出格式:支持导出 YAML 或 JSON,也可以直接生成 HTML 文档

4.4 知识体系总览

下面这张图把本章的核心脉络串起来了,你可以对照着理解:

接口文档与规范知识体系 OpenAPI / Swagger 规范 YAML 格式 JSON 格式 info 元信息 paths 路径定义 components 组件 servers 服务器 Swagger Editor Swagger UI Swagger Codegen 交互式文档页面 客户端 SDK 代码 接口测试用例 核心思想:一份规范驱动整个 API 生命周期

4.5 实战建议

说了这么多,最后给几个我在项目中总结的实操建议:

  • 先写规范再写代码:我习惯在开发前先把接口的 OpenAPI 规范写好,前后端按规范并行开发。这样联调时基本不会出现字段对不上的情况。
  • 版本控制要跟上:规范文件一定要纳入 Git 管理,每次接口变更都要同步更新。我们团队在 CI 流程里加了校验,如果规范文件没更新,代码不允许合并。
  • 善用 $ref 复用:当多个接口返回相同的数据结构时,用 $ref 引用公共组件,避免重复定义。我见过一个项目,同样的 User 对象在 20 个接口里各写了一遍,改个字段名改到崩溃。
  • 别忽视 description:每个接口、每个参数都写上清晰的描述。你想想看,半年后你自己回来看这段规范,如果没有注释,你还记得那个 status 字段是 0 表示正常还是 1 表示正常吗?

我的习惯:每次写完规范,先用 Swagger Editor 的「Try it out」功能手动测一遍所有接口。这一步能发现很多低级错误,比如参数类型写错、必填字段漏标。等规范没问题了,再开始写业务代码。

好了,这一章的内容就到这里。OpenAPI 规范看起来东西不少,但核心就三件事:描述接口长什么样、用什么格式写、用什么工具管理。把这三点吃透了,接口文档就不再是团队的痛点,而是效率的加速器。