传统 REST 接口设计:为什么它仍然是后端系统最稳的基本功

简介: 本文聚焦传统业务系统中实用的REST设计实践,强调围绕资源建模、合理使用HTTP方法与状态码、统一分页/错误/版本规范,并厘清鉴权与权限边界。不追求教科书式理论,而提供可落地的一致性习惯——REST之稳,不在复杂,而在朴素与坚持。(239字)

过去几年,GraphQL、gRPC、tRPC、BFF、AI Agent 工具接口都很热,但在大多数业务系统里,REST 仍然是最常见、最容易落地、最容易协作的接口风格。

原因很简单:REST 足够朴素。

它基于 HTTP,不要求客户端和服务端共享复杂协议,也不要求团队一开始就搭建完整的 IDL、网关和代码生成体系。前端、移动端、后端、测试、运维都能理解它。一个接口文档写清楚 URL、Method、参数、返回值和状态码,基本就能协作。

但也正因为 REST 看起来简单,很多项目最后会写成“披着 HTTP 外衣的随意 RPC”:所有接口都是 POST /doSomething,状态码永远 200,错误都塞在 message 里,资源命名混乱,分页和过滤各写各的。短期能跑,长期会很难维护。

这篇文章讲的不是 REST 教科书,而是传统业务系统里更实用的一套 REST 设计习惯。

REST 的核心:围绕资源设计

REST 最重要的思想不是“用 JSON”,也不是“用 HTTP”,而是围绕资源建模。

资源可以是用户、订单、商品、文章、评论、文件、任务。接口设计时,URL 表达资源,HTTP Method 表达动作。

比如订单资源:

GET    /orders          查询订单列表
POST   /orders          创建订单
GET    /orders/1001     查询单个订单
PUT    /orders/1001     整体更新订单
PATCH  /orders/1001     部分更新订单
DELETE /orders/1001     删除订单

这种设计的好处是清晰。看到接口就能大致知道它操作什么资源、做什么动作。

反过来,下面这种写法就不太 REST:

POST /getOrderList
POST /createOrder
POST /updateOrderStatus
POST /deleteOrder

它不是不能用,而是把动作都塞进 URL 里,HTTP Method 失去了语义。接口少的时候问题不大,一旦系统变复杂,命名就会越来越乱。

一个典型 REST 请求流程

image.png

一个好的 REST 接口,不只是 Controller 里能返回数据,还要在流程中的每一层保持清楚边界:网关处理通用流量问题,Controller 负责协议和参数,Service 负责业务逻辑,Repository 负责数据访问,DTO 负责对外表达。

HTTP Method 要用对

传统 REST 里最容易混乱的是 Method。

常见约定如下:

Method 含义 是否应该幂等
GET 查询资源
POST 创建资源或提交动作
PUT 整体替换资源
PATCH 局部更新资源 通常是
DELETE 删除资源

幂等的意思是:同一个请求执行一次和执行多次,最终结果一致。

比如:

DELETE /orders/1001

执行一次是删除订单,再执行一次仍然是“订单不存在”,最终状态没有变化,所以它是幂等的。

而:

POST /orders

每执行一次都可能创建一个新订单,所以不是幂等的。

实际业务里,有些动作很难完全资源化,比如“支付订单”“取消订单”“提交审批”。这时可以把动作建模成子资源或业务操作:

POST /orders/1001/payment
POST /orders/1001/cancellation
POST /approval-tasks/2001/submission

不要为了追求形式上的 REST,把所有业务动作硬拧成 PUT /orders/1001。工程设计要讲语义,也要讲可读性。

状态码不要永远 200

很多系统喜欢这样返回:

{
   
  "code": 500,
  "message": "server error",
  "data": null
}

HTTP 状态码却永远是 200 OK

这种做法对调试、网关、监控、SDK、缓存都不友好。更合理的方式是让 HTTP 状态码表达协议层结果,让响应 body 表达业务细节。

常用状态码:

状态码 含义
200 请求成功
201 创建成功
204 成功但无响应体
400 参数错误
401 未登录或 token 无效
403 已登录但无权限
404 资源不存在
409 资源冲突
422 语义校验失败
429 请求过多
500 服务端异常

错误响应可以统一成这样:

{
   
  "error": {
   
    "code": "ORDER_STATUS_INVALID",
    "message": "当前订单状态不允许取消",
    "requestId": "req_01HZX8K7"
  }
}

code 给程序判断,message 给人看,requestId 给排障用。

查询、分页和排序要统一

列表接口是 REST 系统里最容易长歪的地方。

建议统一使用 query string:

GET /orders?status=paid&createdAfter=2026-05-01&page=1&pageSize=20&sort=-createdAt

常见约定:

page / pageSize:传统分页
limit / offset:偏移分页
cursor / limit:游标分页
sort=-createdAt:按创建时间倒序
sort=createdAt:按创建时间正序

如果数据量大,或者列表会频繁新增,游标分页比 page 分页更稳:

GET /orders?cursor=eyJpZCI6MTAwMX0=&limit=20

返回:

{
   
  "items": [],
  "nextCursor": "eyJpZCI6MTAyMX0=",
  "hasMore": true
}

不要每个接口各自发明分页字段。统一约定能明显降低前后端沟通成本。

版本管理要提前设计

接口一旦被客户端使用,就不能随意改。

常见版本方式有三种:

/api/v1/orders
Accept: application/vnd.company.v1+json
?apiVersion=1

业务系统最常用的是 URL 版本:

GET /api/v1/orders

它不一定最优雅,但最直观,网关、文档、测试都容易处理。

版本管理的重点不是路径怎么写,而是不要破坏已有客户端。新增字段通常是兼容的,删除字段、改变字段含义、改变枚举值、改变错误结构,都是高风险变更。

鉴权和权限要分清

REST 接口里经常混淆两个概念:

Authentication:你是谁
Authorization:你能做什么

前者通常通过 token、session、API key、OAuth2 完成。后者要结合角色、资源归属、租户、数据权限判断。

比如:

GET /orders/1001
Authorization: Bearer <token>

服务端不仅要验证 token 是否有效,还要判断当前用户是否有权访问订单 1001

典型错误是只做登录校验,不做资源级权限校验。这样用户只要猜到 ID,就可能越权访问别人的数据。

REST 的优点和边界

REST 的优点很明显:

  • 基于 HTTP,生态成熟;
  • 对人友好,容易调试;
  • 对缓存、代理、网关支持好;
  • 前后端协作成本低;
  • 适合 CRUD 和大多数业务接口。

但它也有边界。

当客户端需要一次请求灵活选择字段、组合多个资源时,GraphQL 可能更合适。

当服务之间追求高性能、强类型、低延迟通信时,gRPC 可能更合适。

当系统内部动作强过程化,比如复杂工作流、批处理任务、命令调度时,RPC 风格也未必比 REST 差。

REST 不是银弹。它适合的是稳定、清晰、资源导向的业务接口。

实践建议

第一,URL 用名词,不要用动词。

GET /users/1
POST /orders
PATCH /products/10

第二,状态码要有语义,不要全部返回 200。

第三,请求和响应 DTO 要稳定,不要直接暴露数据库实体。

第四,分页、排序、错误结构、时间格式要统一。

第五,敏感操作要考虑幂等,比如支付、退款、创建订单,可以使用 Idempotency-Key

POST /payments
Idempotency-Key: 8f0b2b4a-7f2e-4d8a

第六,接口文档要和代码一起维护。OpenAPI / Swagger 不一定完美,但比口口相传可靠。

总结

传统 REST 之所以还在大量系统里使用,不是因为它新,而是因为它稳。

它把接口设计约束在一个简单模型里:

资源用 URL 表达
动作由 HTTP Method 表达
结果由状态码表达
细节由 JSON body 表达

真正写好 REST,不靠复杂框架,而靠一致性。命名一致、状态码一致、错误结构一致、分页一致、权限判断一致,系统就会越来越好维护。

新技术值得学,但 REST 仍然是后端工程师绕不开的基本功。很多系统的问题不是 REST 过时了,而是从一开始就没有认真设计过 REST。

目录
相关文章
|
1天前
|
人工智能 安全 前端开发
ECC 讲透:Claude Code 的全能增强包,不只是 Agents 和 Skills
Everything Claude Code(ECC)是2026年爆火的AI编程增强框架,非简单提示词合集,而是集Agents、Skills、Rules、Hooks、MCP与AgentShield安全扫描于一体的“AI编程操作系统”,深度优化Claude Code等Agent Harness,已获近19万Star。(239字)
54 1
ECC 讲透:Claude Code 的全能增强包,不只是 Agents 和 Skills
|
1天前
|
安全 测试技术 容器
K-460D 无白化瞬干胶技术解析:低挥发单体配方与外观件粘接应用
K-460D是一款甲氧基丙烯酸酯无白化瞬干胶,蒸汽压<0.3 mmHg,实现0级无白化与低气味(VOC<50 g/L);对ABS/PC等达基材破坏级粘接,透光率≥92%,适用于消费电子、光学及医疗器械外观件精密粘接。
44 0
|
1天前
|
人工智能 安全
意图共鸣科技《AI记忆链商业化白皮书3.0》探讨记忆共识:AI记忆如何像普通话那样跨平台互联互通?
“记忆共识”倡导AI用户数据自主权,如普通话般自然形成——不靠强制,而由需求驱动。它推动对话记录、偏好、知识等数字记忆跨平台可导出、可迁移、可复用,让AI从“租用工具”变为“随身伙伴”。安全、开放、共建,是其核心理念。
36 0
|
1天前
|
人工智能 数据可视化 定位技术
CodeGraph vs Understand-Anything:一个给 Agent 查代码地图,一个把项目变成可追问图谱
CodeGraph 与 Understand-Anything 同解“代码迷路”之困:前者是面向编程 Agent 的本地索引工具,专注快速查询调用链、影响范围与上下文;后者是面向人与团队的交互式项目图谱,提供可视化架构、业务域导览与系统理解。二者互补而非替代——一重执行精度,一重认知全局。(239字)
47 1
CodeGraph vs Understand-Anything:一个给 Agent 查代码地图,一个把项目变成可追问图谱
|
1天前
|
人工智能 资源调度 JavaScript
三分钟上手Semgrep,让代码扫描更便捷
Semgrep是一款开源静态分析工具,支持30+编程语言及12种语言的供应链扫描,可快速发现漏洞、检测硬编码密钥、执行编码规范检查。轻量易用,支持CLI、IDE、CI/CD集成,完美适配AI全流程自动化开发。(239字)
36 2
|
1天前
|
人工智能 前端开发 JavaScript
用 Leonxlnx/taste-skill 给 AI 前端降降味
`Leonxlnx/taste-skill` 是专治 AI 前端“廉价感”的审美框架,非组件库,而是一份写给 AI 编码工具(如 Cursor、v0)的 `SKILL.md` 设计守则。它通过 `DESIGN_VARIANCE` 等三个可调旋钮,约束布局、动效与密度,并内置反模版规则(禁紫蓝渐变、假卡片、无源数据等),让 AI 先审稿、再编码。
46 0
|
1天前
|
人工智能 运维 安全
Claude Code/OpenAI Codex自定义API部署:协议兼容、环境变量安全与团队规范化方案详解
在AI编程工具的规模化使用中,为Claude Code与OpenAI Codex配置自定义API端点,是实现模型灵活切换、成本优化、安全管控与团队标准化的核心手段。自定义端点可对接企业内部大模型网关、私有模型服务或第三方兼容接口,突破官方API的限制,同时通过规范的协议适配、环境变量管理与团队协作机制,保障配置的安全性、一致性与可维护性。本文将系统拆解Claude Code与OpenAI Codex自定义API端点的配置逻辑,涵盖协议兼容、环境变量设置、配置文件编写、验证方法及团队规范化管理方案,帮助开发者与团队实现安全、高效、统一的AI编程工具部署。
73 8
|
1天前
|
人工智能 自然语言处理 调度
Matt Pocock 的 21个skill的仓库火了:本周的明星
mattpocock/skills 是一套面向AI编程代理的工程化技能库(当前稳定公开18个),将资深工程师的标准化工作流(需求建模→开发→工程管控→知识沉淀)转化为可按需加载、带资源依赖的模块化Skill,非普通Prompt,显著提升代码质量与协作效率。(239字)
51 0
|
1天前
|
JSON 安全 JavaScript
静态扫描工具第二讲-Horusec
Horusec是一款极速开源SAST工具,18种语言一键扫描,3分钟出报告(较Semgrep提速10倍),深度检测漏洞与Git历史密钥泄露,支持CLI/CI/CD及自定义规则,简单高效、开箱即用。
33 0
|
1天前
|
人工智能 弹性计算 API
阿里云ECS/轻量服务器部署AI Agent:百炼Token Plan接入与配置详解
在阿里云服务器上部署AI Agent并接入百炼Token Plan,是快速搭建稳定、低成本、可规模化运行的AI智能体服务的最优路径。依托阿里云服务器的稳定算力与百炼Token Plan的统一Credits计费模式,AI Agent可实现多模型调用、上下文记忆、工具执行等核心能力,无需复杂运维即可支撑个人开发、团队协作与业务落地。本文以主流的Hermes Agent为例,从部署前准备、服务器选型与创建、百炼Token Plan开通与凭证获取、AI Agent部署与配置、功能验证到常见问题排查,提供完整实操流程,覆盖轻量应用服务器一键部署与ECS手动部署两种方案,适配新手与进阶用户需求。
56 0