Skip to content

REST API 设计

REST 的核心不是把 URL 写成复数,而是把接口当成资源的统一操作面:URL 标识资源,HTTP 方法表达意图,状态码描述结果。这样客户端不必为每个动作记忆一套新规则。

URL 表示资源,不表示页面动作

text
/users              用户集合
/users/42           一个用户
/articles/18        一篇文章
/users/42/articles  某个用户的文章集合

资源通常使用名词和复数形式,路径层级只表达稳定的归属关系。不要把查询条件硬编码进路径;筛选、排序和分页适合使用查询参数。

text
GET /articles?authorId=42&status=published&page=2&pageSize=20

HTTP 方法表达对资源的意图

动作方法示例说明
查询集合GETGET /articles不应修改服务端状态
查询单项GETGET /articles/18找不到时返回 404
创建POSTPOST /articles服务端分配资源标识
完整替换PUTPUT /articles/18客户端提供完整资源表示
局部更新PATCHPATCH /articles/18只提交发生变化的字段
删除DELETEDELETE /articles/18成功可返回 204

GET 不应用于删除、扣款或发送消息等有副作用的操作。浏览器预取、缓存与链接扫描都可能触发 GET,错误使用会造成难以预测的风险。

一个资源的完整示例

http
POST /articles
Content-Type: application/json

{
  "title": "前端工程化地图",
  "content": "..."
}

创建成功后,响应应明确资源位置和数据:

http
HTTP/1.1 201 Created
Location: /articles/18
Content-Type: application/json

{
  "id": 18,
  "title": "前端工程化地图",
  "status": "draft"
}

状态码是客户端处理分支的依据

状态码含义客户端通常如何处理
200请求成功并返回内容渲染最新数据
201创建成功使用返回的资源或跳转详情
204成功但无响应体清理本地状态即可
400请求格式或参数无效提示可修正的输入问题
401未认证引导登录或刷新会话
403已认证但无权限告知无访问权限,不要伪装为 404
404资源不存在显示资源已删除或链接无效
409当前状态冲突提示刷新、合并或重新操作
422语义校验未通过展示具体字段校验信息
500服务端异常记录请求标识,提供重试或反馈入口

错误体保持稳定,比“每个接口各自返回一句文案”更利于前端处理。

json
{
  "code": "VALIDATION_ERROR",
  "message": "请检查提交内容",
  "fields": {
    "title": "标题不能为空"
  },
  "requestId": "req_xxx"
}

不是所有动作都要硬塞进 CRUD

“发布文章”“重置密码”这类业务命令有明确副作用。可把它建模为动作子资源或状态更新,并在团队内保持一致。

text
POST /articles/18/publications
POST /password-reset-requests

关键不是形式,而是让 URL、方法、权限和幂等性共同表达真实业务。设计接口时,先写清资源生命周期和失败分支,再确定路径。

为复用而记录,为理解而整理。