REST (Representational State Transfer)

  • 特点
    • 基于资源(Resource),每个URL代表一种资源(如/users/bills)。
    • 使用HTTP动词(GET、POST、PUT、DELETE)表示操作。
    • 无状态(Stateless),每次请求独立,服务器不保存客户端状态。
    • 返回数据通常是JSON或XML,强调可读性。
    • 支持层次结构(如/users/{id}/bills表示某用户的账单)。
  • 优点
    • 简单直观,易于理解和实现。
    • 与HTTP协议天然契合,浏览器和前端工具支持好。
    • 可缓存(通过HTTP头如ETagCache-Control)。
  • 缺点
    • 对于复杂操作(非CRUD场景),可能需要多个请求,显得繁琐。
    • 没有严格的标准,设计质量因人而异。
  • 适用场景
    • Web应用、移动端API、需要与前端紧密协作的项目。
    • 示例URL:GET /api/v1/users/123POST /api/v1/bills

GraphQL

  • 特点
    • 客户端定义所需数据结构,通过单一端点(通常是/graphql)查询。
    • 支持灵活查询(可以用一个请求获取多资源数据)。
    • 数据以图结构组织,强调关系(如用户和账单的嵌套查询)。
    • 强类型系统,所有字段和操作需预定义Schema。
  • 优点
    • 减少请求次数,前端按需取数据,避免过度或不足获取。
    • 开发体验好,提供自动文档和类型检查。
    • 适合复杂数据关系。
  • 缺点
    • 实现复杂,后端需要额外的解析逻辑。
    • 缓存困难(通常需要依赖客户端或专用工具)。
    • 对新手有学习曲线。
  • 适用场景
    • 数据关系复杂、前端需求多变的项目(如社交网络、内容管理系统)。
    • 示例查询:
      query {
        user(id: 123) {
          name
          bills {
            amount
            status
          }
        }
      }
      

RPC (Remote Procedure Call)

  • 特点
    • 像调用本地函数一样调用远程服务,强调动作而非资源。
    • 常见实现包括gRPC(基于HTTP/2和Protocol Buffers)和JSON-RPC。
    • URL通常简单(如/rpc),操作通过方法名区分(如createUser)。
    • 数据格式紧凑(gRPC用二进制,效率高)。
  • 优点
    • 高性能,尤其gRPC在微服务间通信中表现优异。
    • 类型安全(gRPC通过.proto文件定义接口)。
    • 适合复杂逻辑或服务间调用。
  • 缺点
    • 不够直观,前端集成需要额外工具(如gRPC-web)。
    • 与HTTP的RESTful风格差异大,生态支持较弱。
  • 适用场景
    • 微服务架构、后端服务间通信、高性能需求场景。
    • 示例调用:POST /rpc { "method": "createUser", "params": { "name": "Alice" } }

SOAP (Simple Object Access Protocol)

  • 特点
    • 基于XML,使用WSDL(Web服务描述语言)定义接口。
    • 强调严格的契约和标准,支持复杂操作。
    • 内置安全(WS-Security)和事务支持。
    • 通常通过POST请求传输。
  • 优点
    • 标准化程度高,适合企业级应用。
    • 支持复杂协议和安全性要求。
    • 跨平台性强。
  • 缺点
    • XML格式冗长,解析慢,开发体验差。
    • 配置复杂,现代Web开发中逐渐被淘汰。
  • 适用场景
    • 传统企业系统、金融或电信行业。
    • 示例:调用带有XML envelope的CreateUser操作。

Webhook

  • 特点
    • 服务器主动推送事件到客户端预定义的URL。
    • 不是传统请求-响应模式,而是事件驱动。
    • 常用于异步通知(如支付完成、状态更新)。
  • 优点
    • 实时性强,适合事件驱动场景。
    • 减少客户端轮询开销。
  • 缺点
    • 依赖客户端提供可靠的回调地址。
    • 调试和错误处理复杂。
  • 适用场景
    • 支付回调、实时通知(如GitHub的推送事件)。
    • 示例:服务器推送POST /webhook { "event": "payment_success", "data": {} }

总结

风格核心理念数据格式状态性复杂度典型使用场景
REST资源为中心JSON/XML无状态中等Web应用、移动端
GraphQL查询为中心JSON无状态较高数据复杂的前端应用
RPC操作为中心二进制/JSON可选中高微服务、高性能系统
SOAP契约为中心XML可选企业级传统系统
Webhook事件为中心JSON/XML无状态实时通知、异步处理