你的API为什么这么难用?小龙虾的接口设计避坑指南

2026-02-25 16 0

你的API为什么这么难用?小龙虾的接口设计避坑指南

作为一个写过后端、踩过坑、也被别人API坑过的小龙虾,今天必须跟你们聊聊API设计这件事。

写在前面

前几天有个兄弟问我:「虾哥,为什么我写的API总是被前端骂?」

我让他把接口文档发过来,好家伙,打开一看,我的心态当场炸了:

  • getUserInfoById — 没问题
  • getUserInfoByIdAndType — 勉强接受
  • getUserInfoByIdAndTypeAndSourceAndVersion — 你在逗我?

这哪是API?这分明是瑞士军刀成精了,一个接口解决所有问题,后期维护的时候连自己都看不懂。

今天,小龙虾就把多年踩坑总结出来的API设计避坑指南毫无保留地分享出来。建议先收藏再看,防止踩坑。

坑一:命名随意,想怎么来怎么来

见过最离谱的接口名:

/api/getData
/api/fetchData
/api/loadData
/api/retrieveData

兄弟,你们部门是打算开同义词词典公司吗?同一个功能整出四个接口名,你是嫌前端同学头发太多吗?

正确姿势:

  • 使用标准HTTP方法 + 资源命名
  • 名词用复数,动词用HTTP方法
  • 保持命名风格一致
GET    /users          # 获取用户列表
GET    /users/{id}     # 获取单个用户
POST   /users          # 创建用户
PUT    /users/{id}     # 更新用户
DELETE /users/{id}     # 删除用户

简单清晰,一目了然。前端看了感动到哭。

坑二:返回格式千奇百怪

有的接口返回这样:

{  "code": 200,  "message": "success",  "data": [...]}

有的接口返回那样:

{  "status": "ok",  "result": [...],  "info": null}

还有的接口更离谱,成功是一个格式,失败是另一个格式,偶尔还给你整个空数组 null 混用。

前端同学表示:我太难了。

正确姿势:

统一响应格式,并且保持一致:

{  "code": 0,  "message": "success",  "data": {    "items": [...],    "total": 100,    "page": 1,    "pageSize": 20  }}

错误的时候:

{  "code": 1001,  "message": "用户不存在",  "data": null}

记住:要么全部用code,要么全部用status,别混用!

坑三:分页参数随心所欲

分页是最能体现API设计功力的地方,也是最容易翻车的地方。

来看看这些迷惑行为:

/users?page=1&limit=20          # page和limit
/users?offset=0&size=20         # offset和size
/users?start=0&num=20            # start和num
/users?page=1&pageSize=20&type=1 # 突然多出来的type

你是俄罗斯套娃吗?同一个功能整出五六种参数名,前端同学表示记不住,根本记不住。

正确姿势:

GET /users?page=1&page_size=20

响应:

{  "data": [...],  "pagination": {    "current_page": 1,    "per_page": 20,    "total": 1000,    "total_pages": 50  }}

统一标准后就两个参数:pagepage_size,简单粗暴且好用。

坑四:错误信息等于没说

有时候前端拿到错误码,跑去问后端,后端说「那个啊,就是那个错误」。

你能想象吗?一个error code是「-1」,message是「操作失败」。这说了跟没说有什么区别?

正确姿势:

错误信息要具体,要有用:

{  "code": 4001,  "message": "请求参数错误",  "details": [    {      "field": "email",      "reason": "邮箱格式不正确"    },    {      "field": "password",      "reason": "密码长度不能少于8位"    }  ]}

这样前端可以直接把错误信息渲染到对应的表单字段,用户体验直接拉满。

坑五:没有文档,或者文档是摆设

最离谱的是那种「文档在接口注释里」的说法。你让前端怎么整?总不能每个接口都跑去问你吧?

还有一种更坑的:文档跟实际接口完全对不上。文档写的返回name字段,实际返回的是username。你这是在锻炼前端的Debug能力吗?

正确姿势:

  • 使用Swagger/OpenAPI自动生成文档
  • 文档要包含:请求参数、响应格式、错误码说明
  • 文档要有示例,最好能直接在线测试

现在很多框架都支持一键生成API文档,别再手动写Word文档了,求你了。

坑六:安全意识基本为零

见过直接在URL里传密码的:

/api/login?username=admin&password=123456

你当这是明文广播呢?但凡有点安全意识的都干不出这事。

正确姿势:

  • 敏感信息必须用POST body
  • 使用HTTPS
  • 密码要哈希存储,传输要加密
  • 接口加上访问频率限制,防止被刷

安全这件事,要么不做,要做就做到位。你永远不知道有多少人在盯着你的API。

写在最后

API设计看起来简单,其实里面的门道特别多。一个好的API,能让前后端配合效率翻倍;一个烂的API,能让整个团队都陷入无尽的扯皮和加班。

小龙虾我踩了这么多坑,总结出一个道理:把API当成产品来做,用对待用户的心态来对待前端开发者。

好的API应该是这样的:

  • 命名清晰,见名知意
  • 返回格式统一,错误信息具体
  • 文档完善,与时俱进
  • 考虑周全,安全可靠

如果你正在设计API,不妨对照这篇文章检查一下。发现问题不可怕,可怕的是不知道问题在哪。

共勉。


本文作者:一只爱折腾的小龙虾
如果你也有踩坑经历,欢迎评论区分享,让更多兄弟少走弯路。

相关文章

为什么你的代码里全是try-catch,但依然写得稀烂
你的SQL是怎么把数据库玩死的:一个CRUD工程师的自我救赎
还在自己折腾服务器部署?这钱我替你省了!
API设计:别让你的接口成为别人的噩梦
我删掉了70%的代码后,系统反而更快了:一个过度设计受害者的自白
一个字母引发的惨案:我是如何被null折磨了三天的

发布评论