REST 与资源建模

REST 以资源为中心组织接口,用统一接口与表述(representation)操作资源状态;资源名用名词复数、通过链接表达关系,避免在路径里塞动词。

REST 是什么

REST 是一种以资源为中心的架构风格,用统一接口与表述操作资源状态。实践中意味着:资源用名词复数命名,层级关系体现在路径上,通过 HTTP 方法表达操作语义,用状态码表达结果,用超媒体表达可继续的动作。它常被简化成“用 JSON 加 HTTP”,其实无状态、可缓存、分层系统与统一接口这些约束才是它带来可伸缩性的原因。

命名对照

做法推荐写法说明
资源命名GET /orders/123名词复数,层级表达从属关系
子资源动作POST /orders/123/cancel无法映射到标准方法时用子资源表达动作
集合过滤GET /orders?status=paid&page=2过滤、分页走查询参数
避免GET /getOrder?id=123动词入路径,缓存与语义都受影响
避免POST /orders/delete/123放弃 HTTP 方法语义,工具链无法识别

基本信息

核心约束统一接口、无状态、可缓存、分层系统、按需代码
无状态含义每个请求自带完成处理所需的信息,服务端不保存会话上下文
状态码使用201 创建成功、204 无内容、409 冲突、422 语义错误
版本策略路径版本、请求头版本或演进式兼容,选定后统一执行
文档方式OpenAPI 描述契约,便于生成客户端与自动化测试

典型使用场景

  • 对外开放接口:资源化设计便于缓存与第三方理解
  • 前后端分离:契约清晰,前端可依据接口文档独立开发
  • 移动端接入:无状态便于横向扩容与负载均衡
  • 多语言客户端:统一接口语义降低各端适配成本
  • 内部服务集成:简单查询与写入用 REST,复杂交互考虑消息
  • 网关治理:按方法与路径做限流、鉴权与审计策略
REST 的约束不止“用 JSON 加 HTTP”:统一接口、无状态、可缓存与分层系统是常被忽略但影响可伸缩性的部分。
把界面逻辑直接映射成资源(每个页面一个接口),会导致接口随界面改版频繁变动,复用性极差。

易错点

  • 按界面逻辑设计资源,接口随页面频繁变动,多端复用无从谈起
  • 所有操作都用 POST 单一路径,放弃 HTTP 语义与缓存能力
  • 用 GET 执行有副作用的操作,被预取或缓存时产生意外写入
  • 接口不返回状态码语义(一律 200 加错误字段),网关与客户端无法统一处理
  • 把会话状态放在服务端并与 REST 命名混用,扩容时需要额外共享存储

数据来源与参考

  • Roy Fielding 博士论文(2000)第 5 章
  • RFC 9110 HTTP Semantics
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌