Web API 设计指南 
遵循 RESTful api。考虑以下内容:
- 版本:/api/v1/
- 资源:URI表示某一资源
- 动作:HTTP方法表示对资源的操作
- 数据:JSON格式数据(请求和响应),带校验
- 状态码:HTTP状态码表示请求结果
- 认证:OAuth 2使用了承载令牌(Bearer tokens) 并且依赖于SSL的底层传输加密。
- 缓存:ETag和Last-Modified
- 错误
1. RESTful API设计规范 
1.1 资源 
- 资源名尽可能使用名词,不使用动词
- URI中的名词表示资源的集合,使用复数形式
- URI中可以包含子资源,用/分隔,嵌套层级不要超过三层
- URI中可以包含查询参数,用?分隔
- URI中的查询参数,应该表示为资源的属性, 过滤、排序、分页等操作
- 复杂参数使用 Body(JSON 格式)
1.2 动作 
使用HTTP方法表示对资源的操作
- GET:查询资源
- POST:创建资源
- PUT:更新资源
- DELETE:删除资源
1.3 数据 
- 数据使用JSON格式
- 数据的键使用_连接单词
1.4 状态码 
- 200:成功(查询) - 201:成功,资源被创建
- 203:成功,资源被修改
- 204:成功,无内容(可以表示删除成功)
- 206:部分成功(分块下载)
 
- 300:重定向 - 301:永久重定向
- 302:临时重定向
- 304:资源未修改,使用缓存
 
- 400:客户端请求错误 - 401:客户端未认证
- 403:客户端认证通过,但是没有权限
- 404:资源不存在
- 405:HTTP方法不支持
- 429:请求过多,限流
 
- 500:服务器内部错误 - 501:服务器不支持当前请求所需要的某个功能(即将开业)
- 502:网关错误
- 503:服务器暂时不可用
- 504:服务器处理超时
 
1.5 认证 
- OAuth 2使用了承载令牌(Bearer tokens) 并且依赖于SSL的底层传输加密。
- CORS
1.6 缓存 
sh
# TODO Etag or Last-Modified1.7 错误 
json
{
  "code": 1234,
  "message": "Something bad happened :(",
  "description": "More details about the error here"
}PUT or POST
json
{
  "code": 1024,
  "message": "Validation Failed",
  "errors": [
    {
      "code": 5432,
      "field": "first_name",
      "message": "First name cannot have fancy characters"
    },
    {
      "code": 5622,
      "field": "password",
      "message": "Password cannot be blank"
    }
  ]
}2. RESTful API设计 Checklist 
| 问题 | 选择 | 备注 | 
|---|---|---|
| URL | ||
| API Path 里面 Prefix | /api | |
| Path 里面是否包含 API 版本 | ✅ | /api/v1/ | 
| Path 是否包含动作 | 尽可能不包括 | 例外: auth/login | 
| 模型 ID 形式 | Readable Stable Identity | |
| URL 中模型单数还是复数 | 复数 | |
| 资源是一级(平铺)还是多级(嵌套) | 多级 + 一级 | 注:80% 情况都是遵循模型的归属,少量情况(常见在搜索)使用一级 | 
| 搜索如何实现,独立接口( /models/search)还是基于列表/models/接口 | 统一 | /search接口 | 
| 是否有 Alias URL | 🚫 | 简单点 | 
| URL 中模型是否允许缩写(或精简) | ✅ | 一旦做了精简,需要在术语表标记出来 | 
| URL 中模型多个词语拼接的连字符 | - | |
| Header | ||
| 是否所有 Verb 都使用 POST | 🚫 | |
| 修改(Modify)动作是 POST 还是 PATCH? | POST | |
| HTTP Status 返回值 | 充分利用 HTTP Status | |
| 是否使用考虑限流系统 | ✅ 429 | |
| 是否使用缓存系统 | 🚫 | 简单一些,使用动态数据,去除缓存能力 | 
| 是否校验 UserAgent | ✅ | |
| 是否校验 Referrral | 🚫 | |
| Request | ||
| 复杂的参数是放到 Form Fields 还是单独一个 JSON Body | Body | |
| 子资源是一次性查询还是独立查询 | 嵌套 | |
| 分页参数存放 | URL Query | |
| 分页方式 | Page | |
| 分页控制者 | 服务端 | |
| Response | ||
| 模型呈现种类 | 多种模型 | 使用的 BO / VO / Tiny / Rich | 
| 大模型如何包含子模型模型 | 核心模型 + 多次关联资源查询 | |
| 字段返回是按需还是归并还是统一 | 统一 | Tiny Model(可选) / Model(默认) / Rich Model(可选) | 
| 字段表现格式 | snake_case | |
| 错误码 | 无 | 注:很多场景只要 message | 
| 错误格式 | 全局统一 | |
| 时区 | ISO 8601 | 只使用一种格式,不再支持多种方案 | 
修改自:实用 Web API 规范
3. API 文档 
OpenAPI API 接口规范,是一种定义 RESTful API 的标准,它是基于 Swagger 项目的开源规范,可以用 YAML 或 JSON 格式编写 API 文档。包括 API 的基本信息、整体设计、安全、请求、响应等等。
RESTful API 只是一种风格指导,没有规范(落地),OpenAPI 是一种将 RESTful API 规范化的标准,并进行扩展。