后端基础-API设计与OpenAPI
后端基础-API设计与OpenAPI
目录
第1章 API 契约
1.1 API
- API 是客户端和服务端之间的接口契约。
- 契约至少包含:
- 路径
- 方法
- 参数
- 返回值
- 错误码
- 认证要求
1.2 设计 API 时先看什么
- 资源是什么
- 用什么方法操作
- 参数放路径、查询还是请求体
- 成功返回什么结构
- 失败返回什么状态码和错误体
- 是否需要认证
第2章 RESTful 与资源
2.1 RESTful
- RESTful 是一种 Web API 设计风格,不是协议。
- 核心做法是把业务对象抽象成资源,再用 HTTP 方法操作资源。
示例:
GET /users/1POST /usersPUT /users/1PATCH /users/1DELETE /users/1
2.2 资源
- 资源通常用名词表示,不用动词表示。
- 资源路径描述“操作对象”,HTTP 方法描述“操作类型”。
更稳的写法:
POST /orders
不够稳的写法:
POST /createOrder
第3章 参数与响应结构
3.1 路径参数
- 路径参数用于标识具体资源。
text
/users/{userId}
userId一般要求明确、稳定、可定位单个资源。
3.2 查询参数
- 查询参数用于筛选、排序、分页、开关项。
text
/users?page=1&pageSize=20&role=admin
- 查询参数更像“查找条件”,不是资源主标识。
3.3 请求体
- 请求体用于提交结构化输入。
POST、PUT、PATCH通常更常见请求体。- 请求体的格式要和
Content-Type对应。
3.4 响应体
- 响应体用于返回数据或错误信息。
- 响应格式要尽量稳定,避免字段含义频繁变化。
常见返回结构:
json
{
"data": {
"id": 1,
"name": "alice"
}
}
错误结构:
json
{
"code": "USER_NOT_FOUND",
"message": "user not found"
}
3.5 幂等
- 幂等指同一个请求重复执行,多次结果和一次结果在目标状态上保持一致。
GET、PUT、DELETE通常要求幂等。POST默认不幂等,但可以通过幂等键等机制约束重复提交。
3.6 分页
- 列表接口通常要提供分页。
- 常见参数:
page、pageSize,或游标参数cursor。 - 偏移分页实现简单,游标分页更适合大数据量和连续翻页。
3.7 版本管理
- API 变化可能影响已有客户端。
- 常见做法:
- 路径版本:
/api/v1/users - Header 版本
- 路径版本:
- 大版本变化才切版本,小字段增加不一定要升版本。
第4章 OpenAPI 与 Swagger
4.1 OpenAPI
- OpenAPI 是描述 HTTP API 的标准格式。
- 它描述的是接口契约,不是接口实现。
- 一个 OpenAPI 文档通常会写清:
- 路径
- 方法
- 参数
- 请求体
- 响应体
- 鉴权方式
- 数据模型
4.2 Swagger
- Swagger 现在更多指一组围绕 OpenAPI 的工具链。
- 常见理解:
- OpenAPI:规范
- Swagger UI:文档展示与调试页面
- Swagger Editor:文档编辑工具
4.3 OpenAPI 的价值
- 统一前后端接口理解
- 统一调试入口
- 统一数据模型描述
- 可用于生成 SDK、校验器、接口文档
第5章 鉴权要求如何进入接口契约
5.1 登录接口
- 认证不仅是运行时逻辑,也属于接口契约的一部分。
- 登录接口至少应明确:
- 路径
- 方法
- 请求体格式
- 成功响应结构
常见表达方式:
POST /auth/login- 请求体使用 form 或 JSON
- 返回
access_token
5.2 受保护接口
- 受保护接口应明确写清鉴权方式。
- 常见要求:
text
Authorization: Bearer <token>
- 也就是:
- token 放在哪个位置
- 用什么前缀
- 哪些接口必须登录后访问
在 OpenAPI 里,这类要求通常会被表达成安全方案和接口安全声明。
关联
- 请求与响应怎么承载这些契约:
- 登录要求如何进入接口契约: