写API这件事,说简单也简单,说复杂也复杂。我见过太多团队的API设计——怎么说呢——就像是按菜单点菜一样,一个接口一个功能,毫无灵魂。今天不聊理论,就聊我踩过的那些坑,以及一些实用的设计思路。
坑一:命名随缘,想咋叫咋叫
先问大家一个问题:下面两个API路径,哪个更优雅?
/api/getUserInfo
/api/users/{id}
我见过有人写:/getInfo、/queryData、/doSomething——这些命名完全等于没说。人家根本不知道这个接口是干啥的。
好的命名应该是自解释的。一个陌生人看你的URL,大概能猜到它是干什么的,这才是合格的API设计。
坑二:HTTP方法乱用
很多人把GET和POST混着用,或者所有操作都用POST。这是不对的。
记住这个原则:
- GET — 查资源,不应该有任何副作用
- POST — 创资源,比如新建用户、新建订单
- PUT — 完整替换资源
- PATCH — 部分更新资源
- DELETE — 删除资源
我以前也觉得这个无所谓,但后来对接的时候发现,很多人就是因为用了错误的方法,导致缓存失效、接口被误用,问题一堆。规范不是形式主义,是降低沟通成本的武器。
坑三:错误处理像便秘
很多接口的错误返回是这样的:
{"code": 0, "msg": "success"}
{"code": 500, "msg": "error"}
500是什么错误?服务器崩了?数据库挂了?还是程序员手滑了?完全没有信息量。
好的错误设计应该包含:
- 错误码(业务层面的,便于客户端判断)
- 人类可读的错误信息
- 请求ID(方便排查问题)
- 可能的话,给出解决建议
我的经验是,每次写错误处理的时候,想象自己是那个要对接你这个接口的人——他们能不能从错误信息里知道出了什么问题?
坑四:版本控制不存在
API是会变的。产品迭代、业务调整,接口改了怎么办?很多人的做法是:直接改,老接口爱咋咋的。
这是给自己挖坑。
正确的做法是从一开始就规划好版本:
/api/v1/users
/api/v2/users
老客户端用v1,新功能用v2,灰度过渡,互不影响。我知道这听起来麻烦,但实际上这是最少痛苦的方案。想想当你需要给一个千万用户的老产品加新功能的时候,你就知道版本控制有多重要了。
坑五:过度封装 or 过度开放
这个坑比较微妙。有的团队喜欢把接口封装得很深,客户端要什么我一次性给你打包好,减少请求数。听起来合理,但问题是:这个"打包"的边界在哪里?每次新增字段都要改接口吗?
另一种极端是接口粒度太细,一个业务操作要调十几个接口,客户端都快疯了。
我的建议是:以业务边界来设计接口,而不是以数据表结构来设计。想想这个接口解决的是什么业务问题,然后围绕这个场景来设计。
一些私货建议
最后说几点我觉得比较重要的:
- 文档先行。在写代码之前先写API文档,这能强迫你思考接口设计的合理性。
- 善用工具。Postman、Bruno、Apifox这些工具不只是测接口的,它们能帮助你思考接口设计的合理性。
- 保持一致性。你们团队的命名规范、返回格式、错误处理方式,最好是统一模板,而不是每个人各写各的。
- 考虑客户端的感受。API是给别人用的,不是给自己炫技的。站在客户端的角度想,他们需要什么字段?返回格式怎么设计更方便使用?
总结
好的API设计,本质上是降低沟通成本。让调用方能快速理解你的接口,让错误信息有帮助,让版本管理不痛苦。技术细节可以慢慢优化,但如果一开始的设计思路不对,后面改起来就是伤筋动骨。
当然,这些只是我的个人经验。如果你们团队有更好的实践,欢迎交流。技术这东西,从来都是百花齐放的。