当前位置: 首页 > news >正文

常见的 API 设计风格

在软件开发中,常见的 API 设计风格主要有以下几种,每种风格适用于不同的场景和需求:


1. RESTful API (主流)

特点

  • 基于 HTTP 协议,使用标准方法(GET/POST/PUT/DELETE)
  • 资源导向(URI 表示资源,如 /users
  • 无状态、可缓存、统一接口
  • 通常返回 JSON/XML

适用场景

  • 公开的 Web 服务(如 GitHub API)
  • 前后端分离架构
  • 需要简单、易理解的接口

示例

GET /api/users/123

2. RPC(Remote Procedure Call)

特点

  • 强调"动作"而非资源(如 /deleteUser
  • 通常使用 POST 方法(所有操作通过 POST 发送)
  • 协议无关(可通过 HTTP、TCP 等实现)

变种

  • JSON-RPC:轻量级,基于 JSON
  • gRPC:Google 开发的高性能二进制协议(基于 HTTP/2)
  • XML-RPC:传统 SOAP 的前身

适用场景

  • 内部微服务通信(如 gRPC)
  • 需要高性能的场景
  • 操作导向的系统(如银行转账)

示例

POST /rpc
{"method": "deleteUser","params": {"id": 123},"id": 1
}

3. GraphQL (新兴)

特点

  • 客户端自定义查询字段
  • 单一端点(通常 /graphql
  • 强类型系统
  • 减少过度获取(Over-fetching)数据

适用场景

  • 复杂数据关系的系统(如社交网络)
  • 需要灵活查询的客户端(如移动端)
  • 多数据源聚合

示例

query {user(id: 123) {nameposts(limit: 5) {title}}
}

4. SOAP (传统)

特点

  • 基于 XML 的协议
  • 严格的 WSDL 规范
  • 内置安全/事务支持
  • 通常通过 HTTP POST 传输

适用场景

  • 企业级系统(如银行、政府)
  • 需要 ACID 事务的场景
  • 遗留系统集成

示例

POST /soap
<Envelope><Body><GetUser><Id>123</Id></GetUser></Body>
</Envelope>

5. WebSocket API

特点

  • 全双工实时通信
  • 保持长连接
  • 适合高频数据推送

适用场景

  • 实时聊天应用
  • 股票行情推送
  • 在线游戏

示例

// 客户端代码
socket.send(JSON.stringify({action: "join", room: "news"}));

6. Webhook

特点

  • 反向 API(服务端主动调用客户端)
  • 事件驱动模型
  • 通常用于异步通知

适用场景

  • 支付结果回调
  • CI/CD 流水线触发
  • 第三方服务集成(如 Slack 机器人)

示例

POST /callback
Content-Type: application/json
{"event": "payment_success","order_id": "12345"
}

风格对比表

风格协议数据格式性能灵活性学习成本典型应用
RESTfulHTTPJSON/XML公开 Web API
RPC/gRPC任意二进制微服务内部通信
GraphQLHTTPJSON可变复杂数据查询
SOAPHTTP/SMTPXML企业级系统
WebSocketWS/WSS任意实时应用
WebhookHTTPJSON/XML-事件通知

如何选择 API 风格?

  1. 公开 API → RESTful 或 GraphQL
  2. 内部高性能通信 → gRPC
  3. 实时双向通信 → WebSocket
  4. 企业级集成 → SOAP(仅限遗留系统)
  5. 事件驱动架构 → Webhook + RESTful

现代系统常组合使用多种风格,例如:

  • RESTful 提供基础 CRUD
  • GraphQL 处理复杂查询
  • gRPC 处理微服务间通信
  • Webhook 实现异步通知

相关文章:

  • 列表、字符串、heapq堆对列算法
  • windows10 wsl2 安装ubuntu和docker
  • 中间件--ClickHouse-6--SQL基础(类似Mysql,存在差异)
  • 【Linux】系统入门
  • cursor AI编辑器的详细使用
  • 深度解析 Vue 项目 Webpack 分包与合包 一文读懂
  • Hadoop数据压缩教程
  • 深入理解栈数据结构:从基础概念到高级应用
  • Dify简介:从架构到部署与应用解析
  • go的json unmarshal和 k8s的deepcopy对比
  • 数据结构:最小生成树的普里姆算法和克鲁斯卡尔算法
  • 记录学习的第二十六天
  • 【ISP】AWB的基本原理介绍(基于灰度像素检测)
  • 【数据结构 · 初阶】- 带头双向循环链表
  • java Stream流
  • 【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现
  • PasteForm框架开发之Entity多级嵌套的表单的实现
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第八讲)
  • jupyter中切换Anaconda虚拟环境
  • 自定义类型之结构体
  • 多地跟进官宣下调公积金贷款利率,最低降至2.1%
  • 秦洪看盘|受阻回落,蓄积新做多能量
  • 一揽子十条货币政策措施出炉:降准降息,设立五千亿服务消费与养老再贷款
  • 德国新一届联邦政府宣誓就职
  • 被炒热的“高潮针”:超适应症使用,安全性和有效性存疑
  • 独家专访|白先勇:我的家乡不是哪个地点,是中国传统文化