RESTful API 设计原则与流程
设计原则
API 设计良好的要求
- 跨平台/跨终端 即任何操作系统(win/linux/unix/mac)任何应用终端(chrome/postman/python)都可以访问。 但是客户端Client 需要满足和API服务Service 约定好的交互数据结构(json/xml等)。
- 透明性 即server端的功能修改不能影响客户端的使用。 功能修改 增删改 所有功能以及功能参数都应该设置为可发现。
REST
表述性状态转移(Representational State Transfer) 2000 年Roy Fielding 基于超媒体构建分布式系统的架构风格。 独立于任何基础协议,但是最常见的Rest实现就是使用HTTP作为应用层协议。
RESTful API 设计原则
- 围绕资源设计 资源 客户端可以访问的任何类型的对象、数据、服务。不过设计的时候最好偏重于单个业务实体,尽管实现的过程中可能需要多个表的关联操作。尽量不爆露内部实现细节。 资源应该按照层级和集合来设计,层级就是指资源与子类资源的关系,上层资源应该由检索子类资源的功能,同时子类资源也应该由自己的URI,集合即是分类资源的设计,不同集合之间的关系。
- API的URI 应该是与资源 一一对应。 每个资源的标识符也就是URI,应该是唯一的。
- 客户端使用API服务的方式表现为资源(数据)交换。 在表现形式上,是通过资源交换进行的。
- 使用统一接口。 HTTP GET(获取)/POST(修改)/DELETE(删除)/PUT(新建) 约定好接口与功能要求 返回码应该与http一致。比如说新建 就应该是返回码201, 更新成功返回200,删除成功204,异步请求202(接受请求但没有处理完成),更新失败400等。具体参考http的返回码。
- 无状态请求模型 API独立 可以任意顺序访问。
注意点
- 异步处理 当接受到一个异步处理时, 应该返回202,接受请求但没有处理完成。同时还要提供查询处理状态的api,使得客户端可以通过轮询的方式来监控处理状态。
- 数据筛选和分页 API应当接受筛选器,简单的操作(比如说排序)来作为参数,以及提供分页功能(通常是使用limit和offset两个参数控制),同时为了安全考虑,应当对这两个参数进行限制。 如果数据列比较庞大,也可以提供列筛选器来减少返回数据内容。 所有参数都应当设置合理的默认值。
- 关于二进制资源 图片 文件等应该接受部分响应。设置header Accept-Ranges,代表GET操作支持部分请求。
设计流程
- 罗列API列表。
- 考虑业务上的功能点,罗列客户端可能需要的资源列表。
- 根据资源类型,按照集合和分级的方式划分资源。
- 将划分好的资源借助工具直观地表示出来。(可选) e.g. Index —Header —Body Header —Blog —About …
-
上一步的表示只包含了资源之间的一层关系,所以我们还需要有一个更为直观的表示,来清楚资源间的关系,这里的关系主要是状态转移的方向。
- 选择技术架构。
- 媒体类型(现大多是json)
- Web框架(好的Web框架能够事半功倍)
-
实现。
- 发布。到这个阶段就已经完成了整体的后端部分。选择一种方式将自己的成果展示出来。
- 直接发布。(无客户端)
- 构建web前端。
- 构建桌面版客户端。
注意点
- 在做的过程中多看看设计原则。/捂脸
- 需求是一直在变的,做好版本控制。
- 命名。 尽可能贴近业务上的资源实体