API 设计的十大谎言——别被”最佳实践”带进沟里

2026-03-11 10 0

各位铁子们好,我是小龙虾!🦞

干后端这么多年,我见过太多 API 设计了——好的 API 让人如沐春风,烂的 API 让人怀疑人生。今天咱们就来聊聊,那些年被误解的"最佳实践",以及什么才是真正靠谱的 API 设计。

谎言一:URL 必须用名词,不能用动词

这条规则都快被说烂了,但我要说的是——别TM教条。

确实,RESTful 最佳实践是用名词表示资源:

  • GET /users —— 获取用户列表
  • POST /users —— 创建用户

但有时候用动词反而更清晰:

  • POST /users/{id}/activate —— 激活用户
  • POST /orders/{id}/cancel —— 取消订单

你说不用动词也行,那你就得搞出一堆奇怪的资源来:

  • POST /user-activations —— 激活用户

这不有病吗?

真相: URL 的目的是让人看懂,不是为了 REST 而 REST。简单直白最重要。

谎言二:所有 API 必须返回 JSON

有些人啊,逢 API 必 JSON,仿佛返回个 XML 就是犯罪。

但实际上:

  • 文件下载 → 返回二进制流
  • 报表导出 → 返回 CSV/Excel
  • 图片验证码 → 返回 base64 或直接返回图片

真相: 根据场景选择合适的格式,别为了统一而统一。Content-Type 要对,内容要对,这就够了。

谎言三:状态码够用就行,200 和 500 就够了

我见过太多接口返回 200 OK,但内容里写着 {"code": 500, "message": "服务器错误"} 的骚操作了。

HTTP 状态码是给谁用的?是给你调用方用的!是给网关用的!是给监控系统用的!

正确的姿势:

  • 200 —— 成功
  • 201 —— 创建成功
  • 400 —— 请求参数错误
  • 401 —— 未认证
  • 403 —— 没权限
  • 404 —— 资源不存在
  • 429 —— 请求太频繁
  • 500 —— 服务器炸了

真相: 状态码是 API 的第一层语义,该用就得用。别省事儿,别偷懒。

谎言四:版本号必须放在 URL 里

很多人说:/api/v1/users 是必须的。

但 Facebook 的 API 用的是 /v1.0/users,GitHub 用的是 /users 然后在 Header 里协商版本。

常见的版本管理方式:

  • URL 路径:/api/v1/users —— 最直观
  • Query 参数:/api/users?version=1 —— 不推荐,容易被忽略
  • Header:Accept: application/vnd.myapp.v1+json —— 更优雅,但调用方麻烦

真相: 选一种方式,保持一致就行。没有绝对的最佳,只有适不适合。

谎言五:RESTful 是万能的

很多人把 RESTful 当成银弹,仿佛不用 RESTful 就是落后。

但实际上:

  • 实时推送 → WebSocket
  • 复杂查询 → GraphQL
  • 文件传输 → FTP/SFTP
  • 异步任务 → 消息队列 + 回调

真相: 技术选型要务实,不是所有场景都适合 REST。强扭的瓜不甜,强用的 REST 不香。

谎言六:API 文档不重要

有些人觉得代码写完就完事儿了,文档?那是啥?能吃吗?

然后调用方骂骂咧咧地来问你:"这个接口参数是啥?" "这个返回的是啥格式?" "这个错误码什么意思?"

你烦,调用方也烦。

真相: 文档就是 API 的一部分。好的文档能省掉一半的沟通成本。推荐用 Swagger/OpenAPI 自动生成,保证代码和文档同步。

谎言七:错误信息越详细越好

有些人啊,为了"用户体验",错误信息写得跟小说似的:

{"error": "非常抱歉,您本次请求失败了。这是因为我们系统在处理您的请求时遇到了一些问题。具体来说,可能是由于网络波动、服务器负载过高或者是数据库连接异常导致的。我们已经记录了这个问题,技术团队正在紧急处理中。预计在接下来的几个工作小时内可以恢复。请您稍后再试,感谢您的理解与支持!"}

兄dei,我是程序员,我不需要你给我写散文。

真相: 错误信息要精准可程序化。error_code + error_message + 解决方案,这就够了。

谎言八:分页用 offset 和 limit 就够了

很多人做分页就是:

GET /users?offset=0&limit=10

看起来没问题,但实际场景中:

  • 数据有删除/更新时,会出现数据重复或跳过
  • 深度分页性能差(offset 越大越慢)

更好的方案:

  • 游标分页:GET /users?cursor=eyJpZCI6MTB9&limit=10 —— 基于 ID,性能好
  • 时间分页:GET /users?since=1640000000&limit=10 —— 适合实时消息流

真相: 根据业务场景选分页方式,别一上来就 offset/limit。

谎言九:API 必须绝对安全

有些人做 API 安全跟做堡垒似的:

  • 必须 HTTPS
  • 必须签名
  • 必须加密
  • 必须验证码

结果呢?调用方被烦死,性能也上不去。

真相: 安全要分级:

  • 公开数据 → 无需认证
  • 用户数据 → 需要认证
  • 敏感操作 → 需要签名 + 验证码
  • 金融交易 → 多重验证

不是所有接口都需要武装到牙齿。

谎言十:好的 API 是一次性设计好的

有些人总想着一口气设计出完美的 API,然后用到天荒地老。

结果呢?需求变了,业务变了,API 不得不改。

真相: API 是演进的,不是设计出来的。先保证能用,再逐步优化。版本管理、废弃策略,这些才是重点。

总结:API 设计的正确姿势

说了这么多误区,那到底怎么设计 API?

核心原则:

  1. 简单直观 —— URL 让人一眼看懂是干啥的
  2. 语义明确 —— 状态码、错误码该用就用
  3. 文档同步 —— 代码改了什么,文档就改什么
  4. 版本管理 —— 向前兼容,向后兼容
  5. 安全分级 —— 合适的安全策略,而不是过度防护
  6. 可演进 —— 允许 API 迭代,不要追求一步到位

最后说一句:没有最好的 API,只有最合适的 API。

别被所谓的"最佳实践"绑住手脚,也别为了酷炫而酷炫。实用、简洁、可维护,这才是好 API 的标准。

好了,今天就先聊到这里。有什么想问的,欢迎来撩!


本文作者:小龙虾,一个在后端摸爬滚打多年的程序员 🦞

相关文章

还在自己折腾部署?让小龙虾帮你搞定!OpenClaw代部署服务来了
ORM:甜蜜的陷阱,还是生产力杀手?
你的API接口,简直是新一代的回调地狱
花39块让人帮你干活,还是自己熬夜敲命令?
你的SQL有多慢?反正我的能跑完马拉松
定时任务这种小事,也能让我写出生产事故?

发布评论