API接口设计规范:少踩坑的六条实在经验

## 直接说结论

API 设计规范的核心就三件事:命名统一、错误可读、版本可控。把这三样做到位,前后端联调能省一半扯皮时间。别追求大而全的规范文档,先落地这三点比什么都强。

## 命名这事,我被骂过三次

刚工作那会儿,我设计的第一个接口叫 `/getUserInfo`,同事看了一眼说:“你这动词放前面,是认真的吗?”

后来我改成 `/user/info`,又被吐槽说 info 太模糊,到底是基础信息还是详细信息?最后定成 `/users/{id}/profile`,才算消停。这件事让我明白,命名不是自己看着顺眼就行,得让调用方一眼看懂资源关系。

我的经验是:路径用名词复数,层级表达从属关系,动词交给 HTTP 方法去表达。`GET /orders/{id}/items` 比 `/getOrderItems` 清楚得多。查询参数用 `?status=paid&page=2` 这种扁平结构,别搞嵌套三层以上,否则调试时眼睛都花了。字段名统一用 snake_case 还是 camelCase 都行,关键是整个项目别混着来,我见过一个接口返回里两种风格同时存在的,那酸爽。

## 错误码别只丢一个 500

有次线上出问题,前端同事截图给我看,接口返回 `{“code”: 500, “msg”: “系统繁忙”}`。我问他具体什么操作触发的,他说不知道,因为所有错误长得一模一样。

那次之后我改了策略:业务错误码分段管理,比如 1xxxx 是用户模块,2xxxx 是订单模块。HTTP 状态码该用 400 就用 400,该用 404 就用 404,别全塞 200 里再靠 body 判断。错误响应体里带上 `request_id`,排查问题时拿这个 ID 去日志系统一搜,链路清清楚楚。

还有一点,错误信息别写“参数错误”这种废话。写成“字段 `mobile` 格式不正确,应为 11 位数字”,前端拿到就能直接弹给用户看。

## 版本控制,越早做越省事

我吃过最大的亏,是在一个已经上线半年的项目里改返回结构。把 `user_name` 改成 `username`,觉得反正就一个字段。结果有个老客户端没更新,直接白屏。

后来学乖了:URL 里带版本号,`/v1/users` 和 `/v2/users` 可以并存。新版本改结构,老版本继续跑,给调用方留足迁移时间。别信“我们内部系统不用版本”,只要有人调你的接口,就得考虑兼容。兼容策略也简单:加字段可以,删字段和改类型必须开新版本。以官方说明为准这句话放在这里也适用——文档写清楚每个版本的生命周期,比口头承诺靠谱。

## 文档和示例,比规范本身重要

我见过太多团队花两周写规范文档,然后没人看。问题出在文档里全是“应该”“建议”,没有能直接跑的示例。

我的做法是:每个接口配一个 curl 示例,请求参数和响应字段都标上类型和是否必填。再懒一点,用 OpenAPI 描述文件自动生成文档,改代码时顺手更新描述,比单独维护一份 Word 强。联调时前端直接照着示例构造请求,有问题先看文档,减少一半“这个字段什么意思”的提问。

## 常见问题

**Q:接口返回时间格式用时间戳还是字符串?**
A:推荐 ISO 8601 字符串,比如 `2024-01-15T10:30:00+08:00`。时间戳可读性差,跨时区还容易算错,字符串格式前端直接能解析,调试也直观。

**Q:分页参数用 offset 还是 cursor?**
A:数据量小用 offset,简单直接;数据量大或实时性高用 cursor,避免翻页时数据重复或遗漏。具体选哪个看业务场景,没有绝对标准。

**Q:PUT 和 PATCH 到底怎么选?**
A:PUT 是全量替换,PATCH 是局部更新。如果只想改一个字段,用 PATCH 更合适,但实际项目里很多团队直接用 POST 加动作路径,也能跑,关键是团队内部说清楚。

**Q:接口超时时间设多少合适?**
A:普通查询 3 到 5 秒,复杂导出或批量操作单独设长超时并走异步。别所有接口一个超时值,容易把慢接口拖死。

**Q:要不要做接口幂等?**
A:涉及支付、下单、扣库存这类操作必须做。用唯一请求 ID 或业务单号去重,防止用户连点两下产生两笔订单。

## 写在最后

规范这东西,写出来容易,落地难。你们团队现在用的接口规范里,哪一条是踩过坑之后才加上的?有没有那种“明明写了但没人遵守”的规定?评论区聊聊,我看看是不是大家都一样。

Leave a Comment

🤖 来写小助手
你好!我是来写小助手,可以聊聊 AI 工具,也可以试试姓名解析或法律咨询。
AI 出图 / 文案代做  |  订单查询