HTTP 请求方法选择与 RESTful 实践(对比 GraphQL、RPC)

HTTP 请求方法选择与 RESTful 实践
(同时对比 GraphQL 和 RPC 风格)

这是后端接口设计中最常被问、也最容易踩坑的主题之一。下面用 2025–2026 年实际项目中最常见的视角,把它们放在一起对比,帮助你建立清晰的决策框架。

1. HTTP 方法的核心语义(RESTful 视角)

HTTP 方法幂等性安全性典型语义(RESTful 推荐用法)常见实际误用场景2025–2026 项目中占比(粗估)
GET获取资源(只读)把搜索、过滤参数写在 body 里~60–70%
POST创建资源、提交数据、触发非幂等操作用于“查询”复杂条件(应优先 GET + query)~20–30%
PUT整体替换资源(完整覆盖)部分更新也用 PUT(应改用 PATCH)~3–8%
PATCH否/是*部分更新资源(JSON Patch / JSON Merge Patch)整个资源都传(浪费带宽 + 并发冲突风险高)~5–15%(逐年上升)
DELETE删除资源软删除、逻辑删除也用 DELETE(争议较大)~3–8%
HEAD只返回响应头(常用于检查资源是否存在/修改时间)极少用<1%
OPTIONS预检请求 / 描述资源支持的方法浏览器 CORS 自动发,几乎不用手写自动产生

幂等性:多次请求对服务器状态的影响与一次相同
安全性:请求不应该改变服务器状态(GET/HEAD/OPTIONS 应安全)

2. RESTful 资源设计时的典型方法选择表

操作类型推荐 HTTP 方法URL 示例body 是否必须备注与注意事项
获取单个资源GET/users/123优先 query string 传筛选条件
获取资源列表GET/users/users?role=admin复杂过滤 → query 或 POST(争议)
创建资源POST/users返回 201 + Location 头
整体替换资源PUT/users/123必须传完整资源
部分更新资源PATCH/users/123JSON Patch 格式最规范
删除资源DELETE/users/123否/可选软删除建议用 PATCH(is_deleted=true)
批量操作POST/users/batch-delete/batchRESTful 不鼓励批量,但现实中常见
触发动作(非 CRUD)POST/orders/456/ship/posts/789/like视情况RPC 风格常见做法
搜索(复杂条件)GET / POSTGET /search 或 POST /searchPOST 时是大厂多用 POST + body(避开 URL 长度限制)

3. REST vs GraphQL vs RPC 风格对比(2025–2026 视角)

维度经典 REST (HTTP 方法 + 资源路径)GraphQLRPC 风格(gRPC / JSON-RPC / POST 重度滥用)
接口数量较多(每个资源/子资源一个路径)极少(通常一个 /graphql 端点)极多(每个动作一个方法/路径)
请求方式语义化 HTTP 方法几乎全 POST几乎全 POST
响应字段控制固定字段或字段过滤(?fields=)客户端精确声明需要字段服务端决定全部返回
版本管理URL 版本(/v1/users)或 headerSchema 演进 + 弃用字段方法名带版本(UserServiceV2)
幂等性表达天然支持(GET/PUT/DELETE)靠客户端自己保证靠方法名约定(CreateUser vs UpsertUser)
批量操作较麻烦(需约定规范或子路径)原生支持(多个 mutation)天然支持(设计 BatchXXX 方法)
移动端/弱网友好中等较好(减少冗余字段)中等–差(常返回超大响应)
缓存友好度高(GET 可缓存)较低(POST 不缓存)
调试/文档友好Swagger / OpenAPI 很成熟GraphiQL / Apollo Studio 极强Swagger 也可,但不如前两者直观
2025–2026 项目占比~50–60%(传统 CRUD 系统)~20–30%(BFF、复杂查询场景)~15–25%(内部系统、gRPC 微服务)

4. 2025–2026 年真实项目中的折中选择趋势

项目类型最常见组合方式为什么这样选
传统管理后台 / 企业系统经典 REST + OpenAPI工具链成熟、幂等性清晰
移动端 / 前后端分离 AppREST + 部分 POST 搜索 + GraphQL BFF减少请求次数、字段精确控制
微服务内部通信gRPC(RPC over HTTP/2)高性能、二进制、强类型
对外开放 APIRESTful + OpenAPI + 版本控制生态最好、合作伙伴友好
复杂查询 + 多端聚合GraphQL(或 tRPC / Apollo Federation)客户端驱动、减少 over-fetching
高并发写操作REST POST + 幂等性 token(或 RPC 风格)防止重复提交

5. 快速决策 checklist(面试/设计时可用)

问自己这 5 个问题:

  1. 这个接口是只读还是会修改状态
    → 只读 → GET(尽量)
    → 修改 → POST / PUT / PATCH / DELETE
  2. 幂等吗?多次调用结果是否相同?
    → 是 → 优先 PUT / DELETE
    → 否 → 用 POST
  3. 需要客户端精确控制返回字段吗?
    → 是 → 考虑 GraphQL 或字段过滤
    → 否 → REST 够用
  4. 是对外 API 还是内部通信?
    → 对外 → REST + OpenAPI(或 GraphQL)
    → 内部 → gRPC / JSON-RPC 更高效
  5. 是否有批量/复杂动作需求?
    → 有 → POST + action 路径 或 GraphQL mutation

如果你正在设计某个具体接口(比如订单、用户、搜索、批量操作),可以告诉我业务场景,我可以帮你给出最推荐的 HTTP 方法 + 路径 + 状态码组合,以及是否值得引入 GraphQL。

文章已创建 4357

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部