← 返回文章列表
知识分享

OpenAPI 是什么:描述 REST 接口的「合同语言」与生态工具

当你写 HTTP API(见 《HTTP 通俗解读》)给前端、移动端或第三方调用时,很快会遇到两类成本:一是说清楚「有哪些路径、参数怎么传、成功和失败长什么样」;二是保证文档与真实实现不漂移。OpenAPI(曾用名与 Swagger 生态强相关)就是用来把这套约定机器可读、人也可读地写下来的规范:一份 OpenAPI 文档(通常是 YAMLJSON)既是接口说明书,也是生成文档、客户端 SDK、Mock、网关校验的输入。

下面从背景、文档里有什么、常见工作流、工具链与边界四个方面说明;版本细节以 OpenAPI Initiative 当前规范为准。

它解决什么问题?

没有统一描述时,团队往往靠 Wiki、口头约定、Postman 集合 或散落在代码注释里的说明来沟通接口。问题在于:

  • 新人上手慢,每个字段的含义要靠问;
  • 改接口容易漏改文档,联调时才发现对不上;
  • 多语言客户端重复手写请求模型,易出错;
  • 测试与网关难以自动知道「哪些参数必填、类型是什么」。

OpenAPI 的思路是:用固定结构描述 API 的元数据(标题、版本、服务器地址)、路径与操作(GET/POST…)、请求/响应体模式(JSON Schema 风格)、鉴权方式(如 Bearer、API Key)、错误码与示例 等。这样,同一份文件可以驱动 Swagger UI / Redoc 出站点文档,也可以交给 代码生成器 出 TypeScript/Java/Kotlin 客户端或服务端桩代码。

和 Swagger 是什么关系?

早年 Swagger 既是工具也是规范名;后来规范捐赠给 Linux 基金会 下的 OpenAPI Initiative,规范正式名称改为 OpenAPI Specification(OAS)。今天口语里仍有人说「Swagger 文档」,多指 符合 OpenAPI 的接口描述文件;而 Swagger Editor / Swagger UI 等是 SmartBear 等品牌下的实现工具(与规范名已区分)。OpenAPI 3.x(当前主流)相对 2.0(曾称 Swagger 2.0)多服务器、更清晰的请求体/内容协商、components 复用等方面更顺手;新项目一般直接选 3.0 或 3.1

一份 OpenAPI 文档里通常有什么?

不必背语法,抓住几块积木即可读懂大多数文件:

  1. openapiinfo:规范版本、API 标题、描述、版本号(面向使用者的「产品版本」,不是 OAS 版本号)。
  2. servers:基地址列表(如 https://api.example.com/v1),可与路径拼接。
  3. paths:每个 URL 模板(如 /users/{id})下挂 get/post/put/deleteoperation,内含 summary/descriptionparameters(路径参数、查询串、Header)、requestBodyresponses(状态码 → 内容类型 → schema)。
  4. components可复用schemas(数据模型)、parametersresponsessecuritySchemes 等,避免复制粘贴。
  5. security:全局或按操作声明「调用前要先满足哪种鉴权」。

Schema 部分大量沿用 JSON Schema 的思路:type: objectpropertiesrequireditems 描述数组、oneOf/allOf 表达联合与组合类型等。你描述的「JSON 长什么样」,就是客户端与服务器对齐的契约

常见开发流程(契约驱动)

实践中常见三种切入点,各有优劣:

1)先写 OpenAPI,再实现(契约优先)
产品/架构把接口定稿,前后端并行:前端用 Mock 开发 UI,后端按 schema 写控制器与校验。适合边界清晰的业务,但需要变更管理(下文「演进」)。

2)从代码注解生成 OpenAPI(实现优先)
Java SpringdocNestJS、部分 Go 框架等可从路由与 DTO 导出 OpenAPI。优点是与代码同步成本低;缺点是注释质量决定文档质量,复杂例子与多版本叙事有时仍要手写维护。

3)混合
核心对外 API手写 YAML 作为真相源;内部 CRUD 由框架生成。很多公司对外 Developer Portal 用手写或 curated 文档,对内另有一套。

没有银弹;关键是团队认定哪一份是权威,并在 CI 里校验(例如 breaking change 检测)。

生态里你会遇到的工具

方向代表能力
可视化文档Swagger UIRedocStoplight Elements:把 OAS 渲染成可浏览页面,有的还支持「试一试」请求(需注意生产环境鉴权与 CORS)。
代码生成OpenAPI GeneratorKiota 等:从 OAS 生成客户端或服务器骨架;生成物风格因语言与模板而异,生成代码是否入库因团队规范而异。
校验与 LintSpectral 等:检查命名、安全头、是否缺少 description、错误响应是否齐全等,把「文档质量」做成门禁。
MockPrismMockoon 等:按 OAS 返回示例或随机符合 schema 的数据,便于前端独立开发。
网关 / 运行时部分 API 网关可按 OAS 做请求校验、路由、限流策略绑定;实现依厂商而定。

工具链越多,越要在团队里约定:生成代码是否提交OAS 放哪个仓库版本号与发布如何对齐

版本演进与兼容性

对外 API 变更时,OpenAPI 描述也应版本化(Git Tag文档里的 info.version、或路径前缀 /v1 /v2 并行)。破坏性变更包括:删字段、改字段类型、把可选改必填、改路径或方法语义等。可以用 diff 工具或商业/开源的 breaking change 检测在 CI 里对比新旧 OAS,减少「悄悄改坏客户端」的事故。

注意:OpenAPI 描述的是契约;真正的向后兼容还要靠服务器实现(例如忽略未知字段、旧客户端仍能读新响应的子集等)——文档对了,实现也要跟上。

OpenAPI 不是万能药:和 GraphQL、gRPC 对比(极简)

  • OpenAPI 面向 HTTP + JSON(常见)资源/操作风格 API,生态集中在 REST-ish 工具链。
  • GraphQL单一端点 + 查询语言,类型系统用 GraphQL Schema 描述,不是 OpenAPI 的同构物;选型是架构问题,不是「OpenAPI 能不能描述 GraphQL」的技术细节能替代的。
  • gRPC 常用 Protobuf 定义服务与消息,二进制协议,和 HTTP/JSON 文档流 是另一条路线;若你同时暴露 REST 网关,可以在网关层维护 OpenAPI 与后端 Protobuf 的对齐(需额外纪律)。

若你的系统主要是 JSON REST,OpenAPI 往往是成本最低的共享语言。

安全与运维上的提醒

  • Swagger UI 暴露在生产:若开启「在线试调」且配置不当,可能带来 CSRF、密钥泄露 等风险;内网文档站、只读展示、或独立开发者门户更常见。
  • OAS 里的 example 与默认值不要夹带真实密钥或隐私数据
  • 鉴权在 OAS 里声明 securitySchemes 并不等于已实现;只是告诉消费者应如何带 Token

小结

问题简答
OpenAPI 是什么?描述 HTTP API 的开放规范(OAS),机器可读,常用于文档与代码生成。
和 Swagger?Swagger 多为历史称呼与工具品牌;规范名是 OpenAPI。
文档里有什么?pathscomponents、schema、鉴权、服务器与元信息。
何时值得用?多团队协作、对外 API、需要自动化文档与客户端生成时收益最大。

如果你正在整理 TLS / HTTPS 与 API 网关安全模型,可对照阅读 《用通俗语言理解 TLS》

延伸阅读