2. RESTful API 设计规范:资源命名、HTTP方法选择、状态码使用、版本控制策略

聊到大屏数据接口设计,我见过太多团队一上来就撸代码,结果接口命名乱七八糟,状态码满天飞。说实话,RESTful 规范不是什么高深理论,它就是一套让前后端能好好沟通的约定。今天我把这几年踩过的坑和积累的经验,一次性说清楚。

2.1 资源命名:别让接口名变成猜谜游戏

资源命名是 API 设计的门面。我个人的习惯是:用名词复数,不用动词。为什么?因为 REST 的核心是「资源」,不是「操作」。

核心原则:

  • 使用名词复数:/users 而不是 /getUser
  • 层级关系用斜杠:/users/123/orders
  • 查询参数过滤:/users?status=active
  • 避免动词:不要出现 /createUser/deleteOrder

我在项目中遇到过这样一个案例:有个同事把接口写成 /api/getUserInfoByUserId,你想想看,这名字又长又绕。后来我建议改成 /users/{id},简洁明了。说白了,好的命名应该让新人看一眼就知道是干嘛的。

小技巧:资源名尽量用英文,别用拼音。我曾经见过 /yonghu/list 这种接口,维护起来真的很痛苦。

2.2 HTTP 方法选择:GET 和 POST 不是万能药

很多新手喜欢所有接口都用 POST,省事。但 RESTful 设计里,每个 HTTP 方法都有它的使命。

方法 用途 幂等性 示例
GET 查询资源 GET /users/123
POST 创建资源 POST /users
PUT 全量更新 PUT /users/123
PATCH 部分更新 PATCH /users/123
DELETE 删除资源 DELETE /users/123

嗯,这里要注意:GET 请求不能修改数据。我见过有人把删除操作写成 GET /deleteUser?id=1,搜索引擎爬虫路过就把数据删了,那场面……你懂的。

避坑指南:我曾经在项目中用 POST 做查询,结果前端传参越来越复杂,最后接口文档写了三页。后来全部改成 GET + 查询参数,清爽多了。记住:查询用 GET,创建用 POST,更新用 PUT/PATCH,删除用 DELETE。

2.3 状态码使用:别让 200 包打天下

状态码是服务器对客户端的「一句话反馈」。我见过最离谱的是:不管成功还是失败,统统返回 200,然后在 body 里塞一个 code 字段。这其实是在「自己造轮子」,完全违背了 HTTP 协议的设计初衷。

常用的状态码其实就这几个:

  • 200 OK:请求成功,返回数据
  • 201 Created:创建成功,通常配合 POST
  • 204 No Content:删除成功,没有返回体
  • 400 Bad Request:参数错误,客户端的问题
  • 401 Unauthorized:没登录或 token 过期
  • 403 Forbidden:没权限,登录了也不让看
  • 404 Not Found:资源不存在
  • 500 Internal Server Error:服务器炸了

我的经验:大屏接口对错误处理要求更高。因为大屏是 7x24 小时运行的,一旦接口报错,前端可能直接白屏。所以我建议:所有错误都返回统一的 JSON 结构,比如:

{
  "code": 400,
  "message": "参数 userId 不能为空",
  "timestamp": 1700000000000
}

你想想看,如果前端能根据 code 字段做统一处理,是不是比解析各种乱七八糟的错误信息要省心得多?

2.4 版本控制策略:给接口留条后路

接口版本控制,说白了就是「别让老客户端挂掉」。我见过太多团队,接口一升级,旧版 App 全部瘫痪,用户骂声一片。

常见的版本控制方式有三种:

方式 示例 优点 缺点
URL 路径 /v1/users 直观,容易路由 URL 不够干净
请求头 Accept: application/vnd.myapp.v1+json URL 干净 调试不方便
查询参数 /users?version=1 实现简单 容易被缓存污染

我个人习惯用 URL 路径方式。为什么?因为直观。前端同学调试时,一眼就能看出用的是哪个版本。我曾经在项目中用过请求头方式,结果每次联调都要解释半天「你那个 Accept 头配对了没」,太累了。

版本策略建议:

  • 大版本用 URL 路径:/v1//v2/
  • 小版本用兼容设计:新增字段不删旧字段
  • 每个版本至少维护 6 个月,给客户端留足升级时间
  • 废弃接口返回 410 Gone 状态码,明确告知客户端

嗯,最后说一句:版本号不要用时间戳。我见过有人用 /v20240101/ 这种命名,结果一年后接口文档里全是各种日期,根本分不清哪个是最新版。

避坑指南:我曾经接手过一个项目,接口版本号写在数据库里。每次升级都要改数据库配置,还要重启服务。后来我全部改成 URL 路径 + Nginx 路由,升级只需要部署新代码,旧版本自动走老路由。省心多了。

好了,RESTful 设计规范就聊这么多。记住一句话:规范不是束缚,是让团队少吵架的约定。下一章我们聊聊大屏接口的缓存策略,那才是真正考验后端功底的地方。