我最近用AI把一个模拟项目X的订单查询API从需求文档一路推到可联调的代码,整个流程走下来,最大的感受是:AI真正省时间的不是“替你写代码”那一下,而是把需求到代码之间那些无聊的“转译工作”压缩了。所谓API开发,一半以上的工作量其实不是在敲代码,而是在把模糊的诉求变成准确的接口定义,把接口定义变成可执行的代码、测试和文档。这中间每一层转换都特别适合AI介入,但前提是你自己得清楚每一步该检查什么。
这篇内容不是讲某个AI工具的广告,而是我基于实际开发经验整理的一套“从需求到代码”的AI辅助工作流。适合正在尝试用AI提升开发效率的个人开发者,也适合小团队里既要做设计又要写代码、还得自己测自己写文档的“全干工程师”。我会把每个阶段的提示词思路、生成结果、常见坑和人工检查点都展开说,尽量做到看完就能照着用。
1. 先把API开发的完整链条拆开看
1.1 传统流程里时间都花在哪
一个典型API从无到有,要经历需求澄清、接口设计、代码实现、自测、文档编写、联调这几个环节。很多人以为最花时间的是写代码,其实不是。我做过一个粗略统计,一个中等复杂度的查询接口,如果需求描述不够清楚,真正写业务逻辑的时间可能只占30%,剩下70%都消耗在沟通确认、接口字段反复修改、测试数据构造、文档同步这些“辅助动作”上。
尤其是团队协作的时候,产品经理给一句“做一个订单列表接口”,这句话里面藏着太多没说的信息:是按创建时间排序还是按更新时间?分页参数叫什么?返回要不要包含商品明细?错误码怎么定义?这些细节如果靠人工一轮轮问,项目节奏会非常拖沓。更麻烦的是,很多团队会跳过接口设计阶段,直接让后端写代码,写完再补文档,导致前后端联调时才发现字段对不上。
AI在中间能起的作用,就是充当一个“快速翻译器”。它可以把你手头那半句话扩成一份完整的需求清单,把需求清单转成接口定义,再把接口定义转成代码骨架。虽然它生成的细节不都正确,但至少能把“空白”填上,让有经验的人去修改,而不是从零开始想。
1.2 AI介入后哪些环节收益最大
从我的实践看,AI介入API开发的收益并不平均,有几个环节是典型的“高杠杆点”,投入一点提示词就能省大量时间。
| 环节 | 传统工作方式 | AI辅助后 | 主要风险 |
|---|---|---|---|
| 需求澄清 | 人工开会或写冗长文档 | AI快速生成问题清单、用户故事、验收标准 | 生成内容可能偏离真实诉求,需要人工筛选 |
| 接口设计 | 手动编写OpenAPI或表格定义字段 | AI根据需求文本生成OpenAPI YAML和字段约束 | 资源路径、状态码语义可能不符合规范 |
| Mock服务 | 手写临时接口模拟数据 | 根据OpenAPI自动生成可运行的Mock | Mock数据和真实业务可能脱节 |
| 代码生成 | 手动创建Controller/Service/DAO分层 | AI生成大部分CRUD代码和参数校验逻辑 | 事务、鉴权、边界情况容易遗漏 |
| 测试与文档 | 手动写测试用例和接口文档 | AI生成测试数据、单元测试和Markdown文档 | 覆盖率不足,文档与代码不一致 |
我的切身体会:AI在“非结构化文本到结构化产物”这一步效率提升最明显。比如把一句话需求变成一份带数据模型的OpenAPI定义,人工做可能半天,AI辅助可能半小时搞定,虽然要修改但基础框架已经有了。反而是“生成代码”这个看起来很炫的功能,实际提升没有想象中大,因为业务上下文和系统既有的风格AI很难完全理解,生成完还是要做不少调整。
2. 需求分析阶段:让AI帮你把模糊想法逼成可落地的需求
2.1 用AI进行需求澄清与拆解
需求阶段最常见的痛点是:需求方只给结论,不给边界。比如“用户可以通过手机号查订单”这句话,乍一看很清楚,但仔细想,手机号是完整匹配还是模糊搜索?查订单是查本人订单还是所有订单?是否需要权限控制?返回的订单列表要按什么排序?
我现在的做法是,拿到一句原始需求后,先让AI扮演“产品经理”的角色,针对需求提问。不用太复杂,用这样一段提示词:
你是一个经验丰富的API产品经理。我当前有一个原始需求:"用户可以通过手机号查订单"。请帮我生成一份需求澄清清单,内容包括: 1. 需要向需求方确认的业务问题列表 2. 每个问题给出2-3个常见选项 3. 根据合理推测,给出你推荐的默认答案 请用表格输出。实测这个提示词很管用。AI会问接口权限、数据范围、分页、排序、返回字段、时间范围、异常处理等问题。虽然有些问题可能产品的确已经想过了,但它的价值是帮你建了一个清单,避免你漏问。
拿到问题答案后,再让AI生成用户故事和验收标准:
基于以下需求描述:{这里粘贴澄清后的需求} 请生成: 1. 用户故事(As a... I want... So that...) 2. 场景描述(正常路径、异常路径) 3. 可测试的验收标准(Given... When... Then...)AI生成的内容一般比较完整,但需要注意,它很容易把“异常场景”做得过于程式化,比如喜欢写“系统返回错误提示”,但不写具体的错误码。你需要把它逼到“能写进测试用例”的颗粒度,可以在提示词里加一句:每个验收标准必须包含准确的HTTP状态码和业务错误码。
2.2 从需求中提取API候选列表
需求清晰之后,下一步不是急着写接口,而是先列出API候选清单。这一步可以继续让AI代劳,但你要给它明确的输出格式。
我习惯让AI输出一个表格,包含资源名称、请求方法、路径、简要描述。提示词这样写:
下面是订单查询相关的需求描述:{粘贴需求} 请识别出其中涉及的资源实体和操作,生成一个候选的RESTful API列表。 要求: - 使用复数名词表示资源 - 每个API需列出方法、路径、用途 - 另外列出我可能需要但需求中未明确提到的API,并说明原因比如“用户可以通过手机号查订单”,AI会建议GET /orders?phone=xxx,同时可能会列出GET /orders/{id}用于查看详情。这符合直觉。第二列出的“可能遗漏的API”往往会给你惊喜,甚至能帮你发现需求方没说出口的需求,比如它可能建议补充一个获取订单状态的轻量接口。
2.3 人工校验的检查点
AI给出的需求拆解只是“初稿”,你仍然要自己做一次人工校验。我个人有一套固定检查点:
- 权限模型是否明确?这个接口是登录用户访问,还是开放接口?是否需要管理员角色?
- 数据隔离是否考虑到?通过手机号查询,是否需要校验当前用户是否为该手机号对应账号?避免越权。
- 幂等性是否讨论?如果接口涉及创建或支付,重复请求如何处理?
- 限流和审计是否有要求?对外暴露的查询接口如果没做限流,容易被打爆。
这些点AI不会主动深挖,需要你自己补齐。一个比较好用的技巧是,在提示词里加一句“请针对每个API补充潜在的安全与边界风险”,它会输出一些通用风险,你再结合系统实际情况过滤。整个需求分析阶段,AI的价值不是替代你思考,而是把“要思考的方向”先铺开,让你更快聚焦到真正的决策点上。
3. 接口设计阶段:AI辅助生成OpenAPI规范与Mock服务
3.1 用AI生成OpenAPI规范的思路
需求确认后,进入接口设计阶段。我强烈建议跳过Excel字段表,直接让AI生成一份OpenAPI 3.0的YAML。OpenAPI的好处是机器可读,后面无论是生成Mock、生成代码片段还是生成文档,都可以基于它来做。
我用的提示词模板是这样的:
你是API设计师。请根据下面的需求描述和业务约束,生成一个OpenAPI 3.0.3规范的YAML文件。 需求描述: {粘贴需求} 业务约束: - 服务前缀为 /api/v1 - 使用JSON格式 - 错误码格式:业务错误码为字符串,如 "ORDER_NOT_FOUND" - 只考虑订单查询场景 要求: - 包含info、servers、paths、components等节点 - paths下每个操作需定义parameters、requestBody、responses - responses中至少包含200、400、404、500四种状态码 - 所有schema需要定义type、required、example - 生成的YAML必须能被OpenAPI校验工具解析AI生成出来的YAML大体可用,但会有几个“常见病”:路径命名有时不规范,比如它会写GET /getOrders,应该改成GET /orders;响应状态码的语义也可能混淆,比如查询不到数据究竟是返回200空列表还是404,需要你明确决策。我的经验是,把业务约束写得越细,生成结果越准。比如你可以明确指出“订单列表查询,当无数据时返回200和空数组”。
另外,OpenAPI的YAML缩进很容易出错。AI生成后我一般会用支持OpenAPI的IDE插件或命令行工具做一次校验,确保语法没问题。如果不方便安装工具,也可以让AI自己检查一遍:“请检查你生成的YAML语法是否正确,并修正缩进问题。”不过这个检查有时不准,最好还是用工具校验。
3.2 数据模型与字段约束的生成
OpenAPI里最耗人工的是components/schemas部分。AI能帮你快速生成字段清单,但字段的边界约束需要额外关注。
我通常会在提示词里指定基础模型:
为订单查询接口设计请求和响应Schema。 请求参数:phone(必填,中国手机号格式)、page(默认1)、pageSize(默认20,最大100)、status(可选枚举:PENDING, PAID, SHIPPED, COMPLETED, CANCELLED)。 响应对象:包含total、items,item里包含订单号orderId、用户昵称、金额、状态、创建时间。 请生成JSON Schema片段,并给出每个字段的说明。AI会生成类似下面的结构:
{ "type": "object", "required": ["total", "items"], "properties": { "total": { "type": "integer", "example": 1 }, "items": { "type": "array", "items": { "type": "object", "required": ["orderId", "amount", "status", "createdAt"], "properties": { "orderId": { "type": "string", "description": "全局唯一订单号" }, "amount": { "type": "number", "format": "decimal", "description": "订单金额,单位为元" }, "status": { "type": "string", "enum": ["PENDING", "PAID", "SHIPPED", "COMPLETED", "CANCELLED"] }, "createdAt": { "type": "string", "format": "date-time" } } } } } }生成后我一般会补充几个字段类型上的细节。比如金额用number可能面临精度问题,如果涉及分账或对账,应该定义为整数(以分为单位)或者string格式的decimal。AI不会理解你们系统的历史约定,所以这类决策还是要人拍板。
3.3 自动生成Mock服务
接口定义一旦稳定,前后端就可以并行开发。这时候需要一份可用的Mock服务。现在常见的OpenAPI工具链里都支持从YAML生成Mock服务器,用起来非常简单。如果你的系统里已经有集成的工具,直接导入YAML即可;如果没有,用基于OpenAPI规范的通用Mock工具也行。
我实际操作中,会让AI帮我生成一个“模拟数据表格”,然后把这个表格转成Mock配置。提示词可以这样写:
根据下面的订单接口Schema,生成5条符合中国电商订单场景的模拟数据。 要求:手机号格式正确,订单号有唯一性,金额保留两位小数,状态至少覆盖3种,时间在最近30天内。AI生成的数据通常足够逼真,反而比自己手工造数效率高很多。需要注意,Mock数据不要用真实的用户手机号或身份证,用一次性、明显虚构的号码。这既是合规要求,也能避免联调时出现误把Mock数据当真实数据的问题。
Mock服务做好之后,前端可以第一时间开始调试,后端也不用再写临时接口给前端。我遇到最多的坑是,Mock服务和真实服务的行为不一致。比如Mock里查不到数据返回的是200空数组,但后端代码实现时可能误返回404,导致联调后期才发现。所以我会在Mock阶段把接口行为定义清楚,把它当作“需求规格”的补充,而不是一次性草稿。
4. 代码生成与实现阶段:AI生成代码的正确姿势
4.1 从OpenAPI生成服务端骨架
拿到一份稳定的OpenAPI定义后,可以直接让AI生成服务端代码骨架。就算你不打算让AI全权写代码,让它先生成Controller层、Service接口和DTO类,也能节省大量敲击键盘的时间。
我常用的提示词是这样的:
根据下面的OpenAPI定义和项目技术栈(Java 17 + Spring Boot 3.x + MyBatis-Plus),生成对应的Controller类和Service接口。 要求: - Controller类使用REST风格,处理参数校验 - Service接口方法返回统一响应体Result<T> - 参数校验使用jakarta.validation注解 - 业务异常使用全局异常处理器,错误码不要硬编码,用常量类定义AI生成的Controller代码一般像下面这个样子,具体细节可能根据你粘贴的定义而变:
@RestController @RequestMapping("/api/v1/orders") public class OrderController { @GetMapping public Result<PageResult<OrderVO>> queryOrders( @RequestParam @Pattern(regexp = "^1\\d{10}$") String phone, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer pageSize) { return orderService.queryByPhone(phone, page, pageSize); } }生成完不要急着往下走,需要做几件事:一是检查注解是否齐全,比如@Validated是否加到Controller类上,否则@Pattern不会生效;二是看返回体结构是否符合你们公司的统一规范;三是确认常量类和异常类型是否已经在项目里存在,不存在就要让AI补生成。AI对项目现有结构的理解是有限的,它默认这个项目是一个“标准项目”,如果你引用了自定义的Result、PageResult,必须明确告诉它类的包路径和字段结构。
4.2 把自然语言转成SQL或业务规则
骨架生成以后,真正的业务逻辑还是需要你手动把关。这里AI能帮你做的是把“中文规则”转成查询条件或服务代码。
比如有一个规则:“用户用手机号查订单时,只显示非删除状态、并且如果订单金额超过1000元需要标记为高优订单。”你可以这样提示AI:
下面是订单查询业务规则: 1. 只查询状态非DELETE的订单 2. 必须按创建时间倒序 3. 金额大于等于1000元时,在返回结果中增加一个布尔字段highPriority 4. 分页查询,page从1开始,pageSize不超过100 请用Java + MyBatis-Plus的LambdaQueryWrapper实现这个查询。注意不要使用原生SQL字符串拼接。AI写出来的查询逻辑基本能跑,但你要检查几个点:一是删除状态的字段名是否和数据库一致;二是金额的比较是用元还是分;三是排序字段是创建时间还是更新时间,这往往是需求里没讲清楚的。这块我的心得是,让AI生成SQL或ORM代码前,先把字段名映射表给它,比如“数据库字段create_time对应Java属性createdAt”,这样可以大幅减少改错。
4.3 人工审查的重点
AI生成的代码里,最常见的隐患不是语法错误,而是“缺失了非功能性逻辑”。我每次都会专门过一遍这几项:
- 鉴权。Controller方法上有没有加权限注解?这个接口是不是需要登录才能访问?如果是,认证信息从哪里获取?AI不会自动帮你加。
- 参数校验。字符串长度、枚举值、格式校验是否覆盖?只校验了phone有没有?pageSize的上限有没有?
- 数据越权。直接根据传入的phone查订单,如果这个接口是登录用户调用的,是否校验过手机号归属?不校验就是严重的越权漏洞。
- 日志与敏感信息。返回结果里是否包含手机号、地址等敏感信息?日志里会不会打印完整手机号?如果是,需要脱敏。
- 事务与并发。如果后续扩展为“查询并锁定订单”,那事务边界、乐观锁怎么设计?当前没涉及,但要留扩展位。
你可以让AI帮你生成一个代码评审清单:
请根据以下代码,对照安全审查要求列出潜在问题。重点关注:鉴权、参数校验、数据越权、敏感信息泄露、空指针风险。AI的回答往往比较笼统,比如“建议增加鉴权”,但不会告诉你具体在哪里加。所以最终还是需要你理解代码的运行逻辑。我的感受是,AI更像一个“高级实习生”,它能快速出活,但出了活你得认真复核,不然留给线上的是雷。
5. 测试与文档阶段:AI补齐最容易偷懒的部分
5.1 根据接口定义生成测试用例
很多开发者在代码写完之后,最不愿意干的两件事就是写测试和写文档。这两件事恰恰是AI能够做得又快又好的。
我一般把OpenAPI定义和接口实现代码直接粘给AI,让它生成测试用例。提示词如下:
以下是订单查询接口的OpenAPI定义和Controller代码。请帮我设计单元测试用例和集成测试用例。 要求: 1. 单元测试使用MockMvc,只测Controller层 2. 集成测试使用随机端口启动嵌入式数据库 3. 至少包含:正常查询、分页参数边界、手机号格式错误、无数据、服务端异常、越权场景 4. 测试数据使用虚构的订单号,避免真实数据AI生成的测试代码经常会有几个问题:一是测试类里的依赖注入可能不符合项目现有写法,二是断言写得太宽松或者太严格,比如“验证返回200”但没验证返回体里的字段值。这些我一般都会自己调整。
另外一个很实用的做法是,让AI生成一张“测试用例对照表”,方便评审和追溯:
| 用例编号 | 场景 | 请求参数 | 预期状态码 | 预期响应片段 | 覆盖点 |
|---|---|---|---|---|---|
| TC01 | 正常按手机号查询 | phone=13800138000, page=1, pageSize=10 | 200 | total=2, items[0].orderId=... | 主流程 |
| TC02 | 手机号格式错误 | phone=123 | 400 | errorCode=PARAM_ERROR | 参数校验 |
| TC03 | 无数据 | phone=13900000000 | 200 | total=0, items=[] | 空结果 |
| TC04 | 服务端异常 | 无(用Mock强制抛错) | 500 | errorCode=SYSTEM_ERROR | 全局异常处理 |
有了这张表,执行测试的粒度就清晰多了。而且我发现,AI生成的用例场景比我想的全面,经常能补上我忽略的边界条件,比如page=0或者pageSize=1000的极端值。
5.2 API文档与示例自动生成
API文档如果手写,最大的问题是和代码脱节。接口改了字段,文档忘了更新,前端照着文档调接口怎么都调不通,这种场景几乎每个团队都遇到过。
AI能帮我们做的是“从最新代码/最新OpenAPI里重新生成文档草稿”。我习惯先让AI生成一份Markdown文档,内容包括接口列表、请求参数、响应示例、错误码。提示词:
根据这份OpenAPI定义,生成面向调用方的API文档。 要求: - 按资源分组 - 每个接口给出一个完整的curl示例和一个Python requests示例 - 对每个响应字段给出含义说明 - 最后单独列一个错误码表,包含HTTP状态码、业务错误码、含义和处理建议生成后,我会重点关注错误码说明是否准确。AI经常会根据错误码名称“脑补”含义,比如ORDER_NOT_FOUND它写成“订单不存在”,但实际业务可能是“该用户无权访问该订单”,这时就必须手动修正,因为错误码的真实含义只有业务方知道。
文档生成这件事,最大的价值其实是“让文档从一个没人愿意碰的负担,变成每次修改后可以快速再生成一遍的资产”。这个思路对我影响很大:不要追求一次把文档写完美,而是建立“代码变动后5分钟刷新文档”的习惯。
5.3 联调时的AI辅助排错
联调阶段,前后端对不上字段、状态码不一致、数据格式不对,是家常便饭。AI在这里也能帮上忙,只是很多人没想到。
当后端收到一个“前端说接口报错”的问题时,我通常会整理一份请求和响应的实际日志,让AI帮忙分析。提示词:
以下是一次API请求的日志。请求参数是xxx,响应状态码是400,响应体是{"errorCode":"PARAM_ERROR","message":"phone must match..."}。后端日志显示参数校验失败。请结合校验逻辑分析可能的原因,并给出前端调用时需要检查的方向。AI会根据校验注解和请求参数对比,通常能快速定位到“前端传的字段名是mobile而不是phone”或者“参数类型传成了字符串”这类问题。这比人肉对比日志快得多。不过要注意,生产环境的日志可能包含敏感信息,不要直接粘贴完整日志。脱敏后再给AI处理,这个习惯要养成。
6. 常见问题与排查技巧实录
6.1 AI生成内容不稳定的应对
同一个提示词,不同时间跑出来的结果可能差别很大。尤其是让AI生成代码时,第一次可能完整,第二次可能漏掉一个方法,第三次又整个结构都变了。我的经验是,不要依赖“一次生成”,而是把“AI生成”当作“多方案参考”。可以利用几个稳定化技巧:
- 固定上下文。每次把相同的背景说明放在前面,避免AI依靠记忆。
- 要求输出结构化内容。比如“先列出文件清单,再逐个文件生成代码”,这比让它一股脑输出更稳定。
- 多次生成取交集。对关键代码,可以让AI生成两份不同风格的实现,然后你对比选优,或者让AI解释两份实现的差异。
- 使用测试驱动生成。先让AI写失败测试,再让它补实现,这样实现是否满足需求有可执行标准。
我踩过的坑是,某次让AI生成一个分页查询,它第一次用了page、size,第二次用了pageNum、pageSize,最后前端和后端对接不上。所以现在我一定会把参数名明确写到提示词里,不让AI自由发挥。
6.2 上下文窗口限制怎么办
大模型的上下文窗口再大,也不可能把整个项目的代码、所有历史决策文档一次性塞进去。实际做API开发时,上下文是分散在不同文件里的。我的应对策略是“分片注入,按需引入”。
比如生成Controller时,只需要粘贴OpenAPI中对应接口的片段,不需要把整个YAML贴进去;生成Service时,把Controller代码和数据库实体类定义贴给它;生成测试时,把Controller和Service代码都贴上。每步只关注当前相关的部分,效果反而更好。
还有一个技巧是建立“项目约定文件”。把你们团队常用的技术栈、代码风格、统一返回体结构、异常类、分页类定义整理成一个约200字的说明,每次让AI生成代码时都把这段内容作为前缀。这样即使AI没有项目全局上下文,也能保持一致风格。
6.3 安全与合规审查不能省
AI生成的代码,尤其是从自然语言直接生成的业务逻辑,很可能存在安全漏洞。我见过AI生成的查询代码中没有加租户隔离条件,也见过它把数据库连接串直接写到配置里。这些如果你不检查,线上出问题就是大事故。
所以我给自己定了一个强制要求,AI生成的所有代码在合并前必须过一遍安全清单,至少包括:
- 输入校验:所有参数是否校验了格式、长度、范围?
- 身份认证:接口是否需要登录?Spring Security等框架的过滤器是否覆盖?
- 越权防护:查询结果是否可能暴露不属于当前用户的数据?
- 敏感信息:响应和日志里是否包含手机号、地址、密码、Token等?
- 依赖安全:AI推荐的依赖版本是否有已知漏洞?如果不知道,用依赖检查工具扫一遍。
这个清单不是AI帮你做的,而是你自己要掌握的底线。AI可以帮你提高效率,但绝不能替你降低标准。
7. 一些我踩出来的实操技巧
如果你准备在实际项目里用这套流程,我可以分享一些细节。
第一,不要让AI直接写“大而全”的完整项目。让它先写一个接口的完整闭环,从Controller到Service到Mock到测试,等你确认风格没问题,再批量推广到其他接口。我试过一次性让AI生成几十个接口的代码,结果项目结构和既有代码风格冲突极大,返工成本比手写还高。
第二,在需求阶段花15分钟把AI生成的问题清单过一遍,远比你写代码到一半再反推需求要省力。很多“接口设计不合理”的问题,其实在需求澄清阶段就能解决。AI帮你列出的默认答案,通常基于行业最佳实践,但最终决策要回归到你的业务场景。
第三,所有AI生成的内容,都当作“初稿”。这意味着你保留最终修改权,不要偷懒直接信任。尤其是涉及金额、权限、数据一致性这种高风险逻辑,务必人工重写或重点审查。
最后再分享一个我屡试不爽的小技巧:当你不知道怎么给AI下指令时,让AI“先给方案再给代码”。比如不要直接说“帮我写一个订单查询接口”,而是说“我需要实现一个订单查询接口,请你先说明接口设计要点、数据库查询策略、可能的风险,然后再给出代码”。这个方法能逼出很多隐藏的设计思考,也让你有机会在对方“动手”之前纠正方向。AI加速API开发,真正的提速不是靠它替你拍板,而是靠它把你的意图快速落成可以讨论和修改的草稿。用得好,你是那个“总工程师”,用不好,AI写的代码就是新的技术债。这个问题,归根结底还是取决于你自己对API开发的理解有多深。