接手过一个老项目联调,接口文档散落在公司wiki、Excel表格、还有几千条微信群聊天记录里。客户端开发找我要一份“标准接口定义”做SDK,我翻了两天文档,整理出来的东西自己看着都心虚。后来我把整个转换流程交给AI跑了一遍:把散装的接口信息喂进去,让它按OpenAPI 3.0规范输出一份标准JSON,再拿校验工具过一遍,接上代码生成器,各端的基础对接代码直接批量生成。这个“接口文档秒变OpenAPI规范”的过程,本质上是用AI当翻译官——把“给人看”的接口文档,翻译成“给机器读”的OpenAPI规范JSON。
这套思路适合后端开发、测试开发、客户端工程师,以及所有被接口文档不齐全、接口变更频繁折磨得够呛的人。不需要你会手写复杂schema,也不要求你懂Swagger的每个细节,只需要按步骤整理信息、会写提示词、会跑校验工具。下面我把整个实操过程、提示词模板、踩过的坑全部摊开讲。
1. 为什么接口文档需要“变身”成OpenAPI规范
1.1 大多数接口文档的现状:人能看懂,机器读不懂
接口文档最常见的形态是三种:一段大白话描述、一张Excel参数表、一份带截图和curl命令的页面文档。比如登录接口,文档里多半这么写:“调用登录接口,传用户名和密码,成功返回token,失败返回错误信息”。人看这句话完全没问题,但机器不行——SDK生成器、Mock服务、API网关都不知道“用户名”这个字段到底叫什么名字、是string还是number、是不是必填。
Excel表格好一点,但问题在于字段风格不统一。同一个项目里,有人把创建时间写成createTime,有人写成created_at,还有人写成crtTime。响应结构更是五花八门:有的是{code, data, message},有的是{status, result, msg},还有的直接给一个嵌套JSON示例让前端自己猜。机器遇到这种文档,只有两种结果:要么报错,要么生成一个完全没法用的SDK。
OpenAPI规范解决的就是这个问题。它用一套统一、严格的字段定义来表达RESTful接口:每个路径、每个方法、每个参数名、参数类型、是否必填、响应结构、鉴权方式,全部写成结构化的JSON或YAML。有了这份文件,人看不看文档已经不重要了,因为Swagger UI、代码生成器、Mock服务、测试工具都能直接消费它。
1.2 OpenAPI规范一次生成,多个环节都在受益
我最初驱动自己去搞这套东西的直接原因,是客户端要SDK。但真把openapi.json跑出来之后发现,受益的地方远不止这一个。
第一个受益方是接口调试。把这个JSON丢给Swagger UI,就能得到一份在线可点击、可填参数、可直接发请求的接口调试页面,比传统文档好用太多。第二个受益方是代码生成。openapi-generator这个开源工具能根据一份JSON同时生成Java、Go、Python、TypeScript、Kotlin等多个语言的客户端SDK,后端接口定义一次,各端对接代码直接从流水线上批量产出。第三个受益方是Mock服务。前后端并行开发时,后端接口还没写完,前端可以用Prism这样的工具加载openapi.json,起一个模拟服务,接口返回全部按规范生成。
还有一个很容易被忽略的价值:OpenAPI JSON是API网关、接口测试平台、自动化测试框架的通用输入格式。很多公司做接口自动化测试、网关限流、参数校验,底层都要一份接口定义,与其每个平台各搞一套,不如统一维护一份openapi.json,大家按需读取。
1.3 手工转换为什么又慢又容易错
有人会说:这活也不能全靠AI,我自己手写行不行?行,但代价很高。我算过一笔账:一个中等复杂度的项目,大约60到100个接口,每个接口涉及路径、请求参数、请求体、响应体、错误码、鉴权方式,手工编写符合OpenAPI规范的JSON,顺利的话要2到3天。这里说的“顺利”是指文档齐全、我对OpenAPI规范很熟的情况。现实通常是文档缺失,参数类型不全,响应结构只能靠猜,这时候手工转换的周期直接奔着一周去了。
更糟的是手写容易出错。OpenAPI规范里有很多隐蔽的约束:required字段必须在properties之后声明,$ref引用的组件必须存在于components.schemas里,数组类型必须写items,枚举值要写成数组而不是对象。少写一个items,整个schema就无法被正确解析。我见过团队花了一下午排查,最后发现只是把enum的括号从方括号写成了花括号。
所以这个场景天然适合AI介入。AI的强项不是替我们思考业务,而是把“半结构化的信息”转换成“严格结构化的JSON”,并且能按照提示词的约束去补齐格式细节。人只需要做两件事:把原始文档整理成AI能读懂的输入,以及在校验环节把AI输出的东西把关。
2. 让AI动手前:把接口信息整理成它能消化的格式
2.1 核心思路:AI不是凭空生成,是“受控翻译”
很多人第一次用AI做这件事,直接把Word文档或网页链接丢给AI,说“帮我生成openapi.json”。结果往往很糟糕:AI输出一份看起来像模像样、但接口路径和真实代码对不上的东西,字段名被AI按“常识”改写,响应结构跟实际返回完全不同。
这里要建立第一个认知:AI在这件事里不是信息源,而是格式转换器。它只能基于你给的材料来翻译,材料里没有的信息它不会知道,材料里写错的信息它也会照单全收。所以正确打开方式是先把接口文档的每个接口抽取成统一、干净的输入结构,再让AI按OpenAPI规范的约束进行转换。这一步做完,后面的事情会顺利得多。
我踩过的教训是:跳过信息整理直接让AI干活,省下来的10分钟,会在后续校验阶段变成1小时的查找错误时间。AI编出一个不存在的字段,或者把接口路径臆造成别的路由,你逐行对照的时候真的会崩溃。
2.2 一份可以直接复制的输入模板
为了让AI稳定输出,我固定使用下面这种分段式输入模板。每个接口用分隔线隔开,内部用明确的字段标签标记,减少AI理解偏差。
接口路径: /api/v1/user/login 方法: POST 接口描述: 用户登录,获取访问令牌 鉴权方式: 无 URL查询参数: 无 请求体(必填字段): username(string), password(string) 响应成功示例: {"code":0,"data":{"token":"abcd1234","expiresIn":7200},"message":"ok"} 响应失败示例: {"code":1001,"message":"用户名或密码错误"} --- 接口路径: /api/v1/user/profile 方法: GET 接口描述: 获取当前登录用户的资料 鉴权方式: Bearer Token(请求头Authorization) URL查询参数: 无 请求体: 无 响应成功示例: {"code":0,"data":{"userId":123,"nickname":"张三","avatar":"https://example.com/a.png","vipLevel":2},"message":"ok"}模板里最关键的是四个点:接口路径和方法名必须和真实代码保持一致,不能凭记忆写;鉴权方式要单独写清楚,因为这是AI最容易漏掉的信息;响应示例要有真实感,字段名尽量和代码里的返回类对齐;必填字段要明确列出来,AI才知道required数组里该填什么。
2.3 工具选型:按数据敏感程度选方案
做这件事的AI工具,我大致分成三类,按场景选。
第一类是在线对话式AI,适合接口信息不涉及核心机密的个人项目或团队内部工具。它上下文窗口大,能一次处理较多接口,输出质量也稳定。第二类是本地部署的模型,适合公司内部接口定义属于敏感数据、不允许出内网的场景。本地模型虽然能力弱一点,但胜在数据安全可控,配合好提示词照样能完成格式转换。第三类是集成在编辑器里的AI编程助手,适合边看代码边生成规范的场景——直接从代码文件里抽接口信息,再让AI生成对应schema。
我的建议是:第一次尝试就用你最顺手的在线AI工具,先把整个流程跑通,再考虑数据合规问题。流程跑通比工具选牛更重要,因为这套方法的瓶颈不在模型智商,而在输入整理和质量校验。
3. 完整实操:从接口文档到OpenAPI JSON
3.1 提示词模板:这样写AI才稳定输出
提示词是整个转换过程的核心。我试过好几个版本,目前最好用的固定模板如下,建议直接复制替换。
你是一名熟悉OpenAPI 3.0规范的接口工程师。我会分批输入接口信息,请把它们转换成一个规范的OpenAPI 3.0 JSON对象。 硬性要求: 1. 只输出JSON,不输出任何解释文字、前言或后记。 2. 每个接口放入paths下,HTTP方法正确对应。 3. 每个写出的字段都必须有type;数字字段说明format(int32/int64/float/double),时间字段用format: date-time。 4. required数组里只列出我明确标注为“必填”的字段。 5. 如果接口需要鉴权,在components.securitySchemes里定义BearerAuth,并在对应路径下加上security声明。 6. 响应结构根据我给的示例反推schema,示例放在该schema的example字段里,字段名以我给的示例为准,不要按照你的常识修改。 7. 如果输入缺失某个信息,宁可省略也不要凭空编造。 8. 顶层请写:openapi: "3.0.3",info.title用“接口文档转换”,info.version用“1.0.0”。 待转换的接口信息如下:逐条说一下我为什么这么写。第一点是防止AI大段废话,我只需要纯JSON,任何解释文字都会破坏后续的自动校验流程。第三点是规范里最容易漏的细节,尤其时间格式不写date-time,生成的SDK里就会变成字符串而不是日期类型。第五点非常关键,因为鉴权信息在手工转换时也最容易被忽略。第六点在后面“踩坑”部分还会详聊,AI默认会用常识改写字段名,这条命令能把它按回去。第七点等于一个保险开关——宁可缺失,不要伪造,后面人工补都比排查假信息容易。
3.2 分批喂数据的节奏设计
很多人在这一步栽跟头:把60个接口一股脑塞进一次对话,AI生成到一半输出被截断,或者后面的接口漏掉,再或者格式漂移、越写越不规范。正确做法是分批喂,一次5到10个接口,按业务模块分组。比如用户中心一批、订单一批、支付一批,模块内接口归在一起,AI生成的paths结构也清晰。
每批生成完,立刻做两件事:第一,把JSON复制到校验工具里看有没有语法错误;第二,随机抽两三个接口,和原始文档对照字段。确认没问题了,再喂下一批。这样做的代价是对话次数变多,但收益是错误能在小范围内被及时发现,而不是等60个接口全部生成完,发现从头到尾字段风格都不统一。
还有一个经验:如果项目接口特别多,上下文记得住前面但记不住最后,可以在新开对话时,把上一批已经生成的“接口路径清单”贴给AI,让它保持路径命名风格一致。不需要把完整JSON传过去,只需给路径列表和命名约定,比如“上一批我们用/login、/profile这种小驼峰路由,请保持”。
3.3 生成之后必须走一遍校验工具链
AI生成的东西,除非你逐字段核对过,否则一律视为“初稿”,不能直接上生产。校验工具链我固定用三件套。
第一件是Swagger Editor,在线版或本地版都行。把生成的JSON粘进去,它会在画布上展示接口结构,同时头部报错区会列出所有格式错误,比如缺了items、$ref引用了不存在的组件、securitySchemes拼写错误。先过这一关,能把“格式错误”消灭掉九成。
第二件是Prism,用来做Mock校验。启动一个模拟服务,加载openapi.json,然后拿实际接口的请求参数去调Mock服务,看返回的响应结构是否符合预期。这一步能验证出Swagger Editor发现不了的问题——schema结构能解析,但字段层级和真实响应对不上。
第三件是openapi-generator,真正验证这份JSON价值的试金石。用命令生成一个 Java 或 TypeScript 客户端,看生成出来的代码类名、字段名、方法签名是否接近我们的预期。这一步不是可选项,它是评估转换质量的硬标准:生成的代码能和真实接口对得上,说明转换成功;对不上,返回去改输入材料。
openapi-generator-cli generate -i openapi.json -g java -o ./generated-client第一次跑通的时候,那种“文档直接变成一堆可编译代码”的感觉,确实会让人上瘾。
3.4 把生成的JSON接入项目生态
校验通过后,openapi.json就不只是一个静态文件了,可以接入工程链路。我建议至少做三件事。
第一,把它纳入版本管理,放在项目根目录或docs/目录下,命名规范一点,比如openapi.json。后续接口变更,就在这个文件的基础上增量修改,而不是每次重新生成一份新的。第二,在CI流水线里加一个步骤,用openapi-generator把这份JSON生成SDK并发布到内部制品库。这样后端接口定义更新后,客户端SDK会自动更新,团队成员拉新代码就能同步到最新接口,彻底告别“手动封装API请求类”的重复劳动。第三,把它接入Swagger UI或Redoc,让测试和前端开发通过浏览器直接查看、调试接口,不需要再去翻wiki。
这一套链路跑通之后,接口文档才真正从“静态的说明文字”变成了“驱动的生产资料”。
4. 实操中遇到的坑与排查实录
4.1 AI“一本正经地编字段”怎么办
这个问题排在所有坑的第一位。有一次我转换一个用户详情接口,输入里响应示例写的是{"nick_name":"张三"},结果AI输出到schema里变成了nickname,它觉得下划线写法“不规范”。字段名一旦被改,前端拿到的JSON里就没有nick_name这个键,整个页面渲染直接白屏。
解决办法有三层。第一层在输入模板里,我已经加了一条“字段名以我给的示例为准,不要按常识修改”。第二层在校验环节,拿原始接口文档和生成的JSON做字段级diff,尤其关注用户自定义字段。第三层是更极端的做法:在输入模板里把字段列表单独列一遍,让AI先声明“本批输入包括以下字段”,再开始转换。这相当于强制它把输入里出现的键名过一遍脑子。
4.2 鉴权信息总是被漏掉
接口文档里如果写着“本接口需要登录”,AI生成的JSON大概率没有security声明。原因很简单:提示词里如果没有明确提鉴权,AI会默认所有接口都是公开的。手写转换时人会记得这件事,AI不会,它只会做字面上的转换。
我的做法是:输入模板里每个接口都把“鉴权方式”作为一个单独字段写出来,哪怕写“无”也要写;提示词里再强调“有鉴权的接口必须在securitySchemes里定义,并在路径下引用”。生成后搜一下整个JSON里security出现的次数,和输入里有鉴权的接口数量对照,不一致就补。
4.3 数组、嵌套对象、枚举的写法总出错
这些都是OpenAPI规范的“细节重灾区”。最常见的错误有两个。第一个是数组的items写错,比如把一个字符串数组写成{"type":"array","items":{"type":"string"}},这没问题,但多层嵌套时AI容易漏层,比如对象数组里忘了给内层对象写type: object。第二个是枚举的写法,规范里枚举必须是数组["MALE","FEMALE"],AI偶尔会写成对象{"MALE":"male","FEMALE":"female"}。
我的排查方法是:生成后重点扫三类关键词——type: array后面必须紧跟items;enum的值必须用方括号包含;$ref引用的组件必须在components.schemas里存在。这三条用脚本或编辑器批量搜索,几秒钟就能检查完。
4.4 大文档输出被截断,AI中途“隐身”
上下文窗口再大,几百个接口一次灌进去,出问题的概率还是很高。截断的表现有两种:一种是在JSON写到一半时停止,常见于数组到一半没闭合;另一种是后面的接口被静默丢弃,AI没有报错,但你数一下paths数量发现少了。
对策就是前面说的分批处理。除此之外,我还会把“先骨架后填充”这个方法用在超大模块上:第一批先让AI生成一份只有paths和operationId的空骨架JSON,第二批再把每个接口的parameters、requestBody、responses逐块填充进去。这样做的好处是即使第二批被截断,骨架还在,重新续跑的成本很低。
4.5 常见问题速查表
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 字段名被改动 | AI按常识改写 | 提示词强调字段名以输入为准;生成后字段级diff |
| 缺少security声明 | 鉴权信息没明确输入 | 输入模板逐接口标鉴权;生成后统计security数量 |
| 数组items丢失 | 嵌套层级多,AI漏层 | 搜索type: array,逐个检查紧跟的items |
| enum写成对象 | 对规范不熟悉 | 提示词给定枚举写法示例;生成后检查括号 |
| 输出被截断 | 单次输入量过大 | 按模块分批,或先骨架后填充 |
| $ref指向不存在的组件 | AI想复用组件但忘了定义 | 用脚本统计$ref引用与components定义,交叉比对 |
| 响应示例字段与真实接口不符 | 输入材料本身不完整 | 回到代码里看真实返回类,修正后重新喂AI |
最后再分享一个独门经验:如果生成的JSON在git仓库里多人协作时频繁冲突,不用慌。因为openapi.json是对格式敏感的,一次很小的字段调整可能在文件里产生一大段diff。我的处理办法是让AI只输出某个接口的局部schema,再手工合并到主文件,避免整份文件重新生成。实际操作中,我一般会把openapi.json的维护也纳入代码评审流程,接口变更时同事能直观看到diff,反而比原来翻文档高效得多。这一段流程跑顺之后,再看到那种“文档写得很漂亮但格式没法用”的接口定义,我的第一反应不是头疼,而是掏出这套转换流程,用AI把它变成真正能驱动工具链的标准JSON。