2026-08-06 16:38:54.639066+08 / restful-api

API 设计原则

从 REST、RPC、Postel 原则和 API First 出发,梳理如何设计简单、一致、稳定且易于长期演进的 API。

Restful ApiApi DesignOpenapi

API 设计原则

RESTful API 与 RPC API 对比

在 API 设计领域,常见的两种架构风格:

典型的 RPC 风格接口包括:

  • CORBA
  • SOAP
  • gRPC

RPC API 通常围绕 操作(Operation) 进行设计。

API 表示客户端可以调用的动作。

示例:

csharp
CreateUser()

GetUserInfo()

TransferMoney()

GenerateReport()

客户端需要了解:

这种方式通常:

  • 与具体业务场景高度绑定
  • 强依赖客户端和服务端约定
  • 难以扩展成开放平台 API

REST 关注的是 资源(Resource) ,而不是操作。

资源通过 URI 标识,并通过标准 HTTP 方法进行操作。

示例:

text
GET /users/123
text
DELETE /users/123

API 描述的是:

系统提供什么资源,而不是内部如何实现。


RESTful API 的优势

降低系统耦合

REST API 降低客户端和服务端之间的依赖。

客户端只需要理解:

  • 资源模型
  • URI 结构
  • HTTP 语义

服务端内部实现可以独立演进。

text
Client

    |
    |
    v

GET /users/100

    |
    |
    v

User Service

客户端不关心后端使用:

  • SQL Server
  • PostgreSQL
  • MongoDB

面向平台的 API

REST API 更适合作为服务生态的平台基础。

核心服务提供通用能力:

text
/users

/orders

/products

这些 API 可以支持:

  • Web 应用
  • 移动应用
  • 内部服务
  • 外部合作伙伴

REST API 设计原则

优先使用 REST + JSON

推荐:

text
HTTP + REST + JSON

请求:

json
{
  "name": "Tom",
  "age": 30
}

响应:

json
{
  "id": 1001,
  "name": "Tom"
}

简单开始,逐步演进

REST API 不需要一开始就达到最高成熟度。

Richardson 成熟度模型:

等级 说明
Level 0 HTTP 作为传输协议
Level 1 引入资源概念
Level 2 正确使用 HTTP 方法
Level 3 HATEOAS

实际推荐:

从简单 REST API 开始,根据业务需求逐步演进。


Postel 鲁棒性原则

原则:

中文:

对输入保持开放,对输出保持谨慎。


接收未知字段

接收客户端数据时:

API 应该忽略未知字段,而不是直接失败。

客户端发送:

json
{
  "name": "Tom",
  "age": 30,
  "nickname": "Tommy"
}

服务端只支持:

json
{
  "name": "Tom",
  "age": 30
}

服务端可以忽略:

text
nickname

优势:

  • 向前兼容
  • API 独立演进
  • 降低客户端与服务端依赖

返回最小数据

API 不应该默认返回大量无关数据。

错误:

json
{
  "id":100,
  "name":"Tom",
  "orders":[],
  "history":[],
  "settings":{}
}

更好的方式:

json
{
  "id":100,
  "name":"Tom"
}

额外数据通过参数获取:

text
GET /users/100?include=orders

API 即产品

API 不应该只是系统内部接口。

应该:

将 API 当作产品。


API 产品原则

像产品负责人一样思考

关注:

  • 客户需求
  • 开发者体验
  • 易用性

避免:

text
Backend implementation convenience

而应该关注:

text
Client developer experience

长期维护一致性

优秀 API 应具备:

  • 命名一致
  • 行为可预测
  • 契约稳定

推荐:

text
GET /users

GET /orders

GET /products

避免:

text
GET /getUserList

POST /createOrderData

API 优先

API First 的核心:

在编码之前先定义 API。

传统方式:

text
Code

↓

Expose API

↓

Ask feedback
text
Design API

↓

Review

↓

Implement

↓

Test

8. API First 要求

8.1 API 规范优先

使用标准规范定义 API:

text
OpenAPI Specification

优势:

  • API 文档
  • 客户端 SDK 生成
  • 自动化验证
  • API 发现

提前 Review

API 应该由:

  • 团队成员
  • 架构评审人员
  • 客户端开发者

在开发前进行评审。


9. API First 的收益

单一事实来源

API 定义成为双方契约:

  • 服务提供方
  • API 消费者
text
openapi.yaml

分离 WHAT 与 HOW

API 应该定义:

text
WHAT

而不是:

text
HOW
text
POST /orders

表示:

创建订单。

不应该暴露:

text
Save database record

Call internal service

Send message queue event

实现可以变化。

API 应保持稳定。


10. API First 与敏捷开发

API First 并不意味着:

不是:

完全设计好所有 API 后才能编码。

API 同样需要迭代。

典型流程:

text
Draft API

↓

Internal Review

↓

Implementation

↓

Feedback

↓

API Evolution

总结

原则 说明
REST First 面向资源设计
Loose Coupling 降低耦合
Postel's Law 输入开放,输出谨慎
API as Product API 产品化
API First 先 API 后实现
Evolution 持续演进

RESTful API 设计目标:

构建简单、一致、稳定、易用,并且可以长期演进的 API 平台。

API 设计原则 | Remi Resume