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

HTTP请求方法在实际开发中并非仅使用POST,但确实存在简化使用现象。


早期因技术限制(如浏览器表单仅支持GET/POST)和简化思维导致过度使用POST。


现代开发推荐RESTful风格:GET查询、POST创建、PUT/PATCH更新、DELETE删除,以提升语义清晰度和利用HTTP原生优势(缓存、幂等性)。


特殊场景如GraphQL主要用POST属设计选择。


不同API风格对比显示:RESTful适合标准化CRUD,GraphQL适合复杂查询,RPC适合高性能通信。


行业趋势呈现GraphQL在复杂前端的增长,RESTful在企业级的主流地位,以及微服务中gRPC的广泛应用。


HTTP的请求方式有很多,为什么实际开发中大多统一只用post请求


这是一个很好的观察,但在实际开发中并不是"大多统一只用post请求" ,而是正确使用不同的HTTP方法。不过你提到的现象确实存在,我来分析一下可能的原因和现实情况:


🔍 为什么会有"只用POST"的现象?

1. 历史遗留问题

复制代码
GET /api/users/delete?id=123

早期很多项目(特别是早期Web应用)确实只用GET/POST,因为:

  • 浏览器表单只支持GET/POST

  • 一些旧框架/代理服务器对PUT/DELETE支持不好

2. 简单化思维

复制代码
// “统一POST派”的常见写法
POST /api/users    // 创建
POST /api/users/update  // 更新
POST /api/users/delete  // 删除

优点:所有操作统一接口风格,无状态性考虑简单

3. 绕过限制

  • 绕过某些防火墙对特定方法的过滤

  • 简化CORS预检请求(POST相对宽松)

现代开发的正确做法:RESTful API

实际开发中,推荐使用语义化的HTTP方法

RESTful风格示例

复制代码
GET    /api/users          # 获取用户列表
GET    /api/users/{id}     # 获取单个用户
POST   /api/users          # 创建用户
PUT    /api/users/{id}     # 更新整个用户
PATCH  /api/users/{id}     # 部分更新用户
DELETE /api/users/{id}     # 删除用户

📊 不同HTTP方法的使用场景

方法 安全性 幂等性 典型场景
GET ✅ 安全 ✅ 幂等 查询数据,不修改资源
POST ❌ 不安全 ❌ 不幂等 创建新资源,非幂等操作
PUT ❌ 不安全 ✅ 幂等 完整更新资源
PATCH ❌ 不安全 ❌ 可能不幂等 部分更新资源
DELETE ❌ 不安全 ✅ 幂等 删除资源

🚫 只用POST的问题

1. 语义不清晰

复制代码
// 模糊的接口
POST /api/users
// 这是在创建?更新?还是查询?

2. 失去HTTP原生优势

  • 缓存机制(GET可被缓存)

  • 幂等性保证(PUT/DELETE的自动重试)

  • 可观测性(监控工具能区分操作类型)

3. 违背REST设计原则

复制代码
// 反模式:所有操作都用POST
POST /api/getUsers
POST /api/createUser
POST /api/updateUser
POST /api/deleteUser

💡 实际开发建议

何时主要用POST?

  1. 非RESTful场景:如RPC风格接口

  2. 复杂操作:涉及多个资源的变更

  3. 文件上传:传统表单提交

  4. 安全性考虑:避免敏感参数出现在URL

现代最佳实践

javascript 复制代码
// 前端请求示例(使用正确的HTTP方法)
const api = {
  // 查询用GET
  getUsers: () => axios.get('/api/users'),
  
  // 创建用POST
  createUser: (data) => axios.post('/api/users', data),
  
  // 更新用PUT/PATCH
  updateUser: (id, data) => axios.put(`/api/users/${id}`, data),
  
  // 删除用DELETE
  deleteUser: (id) => axios.delete(`/api/users/${id}`)
};

🎯 总结

实际上,专业开发中不会"统一只用POST",而是:

  • 80%+ 的项目遵循RESTful或类似规范

  • GET用于读POST用于创建PUT/PATCH用于更新DELETE用于删除

  • 特殊场景(如GraphQL)确实主要用POST,但这是设计选择,不是随意统一


推荐做法:根据操作语义选择HTTP方法,这样代码更清晰、更可维护,也更能利用HTTP协议的优势。


使用表格总结对比:RESTful、GraphQL、RPC


HTTP API 设计风格对比表

对比维度 RESTful GraphQL RPC
核心理念 资源为中心的架构 查询语言为中心 过程调用为中心
请求方法 GET, POST, PUT, DELETE, PATCH 主要用POST(查询/变更) 主要用POST
端点设计 资源导向: /users, /users/{id} 单一端点: /graphql 动作导向: /createUser, /getOrders
数据格式 通常JSON/XML GraphQL Schema定义 通常JSON/XML/二进制
请求结构 URL + HTTP方法 + 头信息 GraphQL查询语言 函数名 + 参数
响应结构 预定义的资源结构 客户端指定返回字段 预定义的返回结构
版本管理 URL版本:/v1/users 或Header版本 Schema演进 字段弃用机制 URL版本:/v2/createUser
缓存机制 利用HTTP缓存 (GET请求) 需要自定义缓存策略 通常无标准缓存
超媒体 HATEOAS(理想情况)
错误处理 HTTP状态码 + 消息体 统一的200状态码 errors字段 自定义错误码/消息

🎯 典型使用场景对比

场景 推荐选择 原因
简单CRUD操作 RESTful 天然匹配,开发简单
复杂数据查询 GraphQL 避免多次请求,按需取字段
微服务间通信 RPC/gRPC 性能高,类型安全
移动端API GraphQL 减少网络请求,节省流量
公开API RESTful 标准化,易理解,工具支持多
实时更新 GraphQL订阅/RPC 实时数据推送需求

📊 技术特性对比

特性 RESTful GraphQL RPC
类型系统 无内置,需Swagger等 强类型Schema 通常有IDL定义
文档生成 OpenAPI/Swagger GraphQL Schema自文档 需额外工具
学习曲线 中高
前端灵活性 低(固定返回) 高(客户端定制) 低(固定返回)
后端复杂度 高(解析器实现)
网络请求数 可能多(n+1问题) 通常少(批量查询) 视设计而定

🔧 实际代码示例对比

RESTful

复制代码
GET /api/v1/users/123
GET /api/v1/users/123/orders

GraphQL

graphql

复制代码
query {
  user(id: 123) {
    name
    email
    orders {
      id
      total
    }
  }
}

RPC

http

复制代码
POST /api/getUser
{
  "method": "getUser",
  "params": {"id": 123},
  "id": 1
}

✅ 选择建议

  1. 选择RESTful当

    • 需要标准化的公共API

    • 简单CRUD操作

    • 希望利用HTTP缓存

  2. 选择GraphQL当

    • 客户端需求多变

    • 需要减少网络请求

    • 有复杂数据关系

  3. 选择RPC当

    • 微服务内部通信

    • 需要高性能(如gRPC)

    • 操作更像"命令"而非"资源操作"

📈 行业趋势

  • 现代应用:越来越多采用GraphQL,特别是移动端和复杂前端应用

  • 企业级:RESTful仍是主流,成熟稳定

  • 微服务:RPC(特别是gRPC)在服务间通信占主导

  • 混合方案:许多公司采用RESTful + GraphQL混合架构

相关推荐
掘根8 小时前
【jsonRpc项目】基于注册发现的RPC客户端/服务端
网络·网络协议·rpc
2501_921649491 天前
2026 如何快速选择股票、外汇金融行情数据 API
后端·python·websocket·金融·restful
Elias不吃糖1 天前
Spring Bean 注入与容器管理:从“怎么交给容器”到“怎么被注入使用”的完整总结
java·spring·rpc·bean
卓码软件测评1 天前
【第三方双重资质软件测试机构:测试RESTful API和SOAP Web Services:LoadRunner协议选择和脚本编写】
测试工具·ci/cd·性能优化·单元测试·测试用例·restful
LuminescenceJ2 天前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
淡泊if2 天前
RESTful API设计标准:单体 vs 微服务的最佳实践
后端·微服务·restful
小二·2 天前
Go 语言系统编程与云原生开发实战(第3篇):企业级 RESTful API 开发 —— 中间件、验证、文档与权限控制
云原生·golang·restful
七夜zippoe2 天前
gRPC高性能RPC框架实战:从Protocol Buffers到流式传输的完整指南
网络·python·网络协议·rpc·protocol
Dontla2 天前
GraphQL介绍(声明式查询)文件上传GraphQL文件上传
后端·graphql