重拾 RESTful API
date
Jan 11, 2024
slug
relearn-restful-api
status
Published
tags
RESTful API
summary
RESTful API 知识点总结
type
Post
REST 是什么REST 限制客户端-服务器(client-server)无状态(Stateless)缓存(Cache)统一接口(Uniform Interface)分层系统(Layered System)按需代码(Code On Demand)统一接口如何设计资源标识通过表述来操作资源自描述信息超媒体作为应用状态引擎RESTful API 设计组成要素例子请求设计规范响应设计规范安全开发者友好最佳实践参考
REST 是什么
Representational State Transfer 数据表现形式地传输
- 万维网软件架构风格
- 特指用来创建网络服务
REST 限制
客户端-服务器(client-server)
- 关注点分离
- 服务端专注数据存储
- 前端专注用户界面
无状态(Stateless)
- 用户会话信息均保存在客户端
- 每次请求必须包括所有信息,不能依赖上下文信息(翻页功能中的下一页必须传入下一页的页码)
- 服务端不保存会话信息,提升了简单性(代码减少)、可靠性(软件稳定程度以及从故障中恢复正常的能力,但从用户会话来说如果保存在后端处理事故很难恢复)、可见性(模块、接口的透明程度,每次请求包含必要的所有信息)
缓存(Cache)
- 所有服务端的响应都必须标记为可缓存或者不可缓存(静态资源:图片、字体、样式等为可缓存,动态资源:接口一般为不可缓存)
- 减少前后端交互,提升性能
统一接口(Uniform Interface)
- 接口设计尽可能的统一、通用
- 接口与实现逻辑解耦,使前后端独立开发
分层系统(Layered System)
- 层与层知道彼此超过一层互不干涉
- 客户端不知道是和代理还是服务器通信
- 安全层、负载均衡(流量分发)、缓存层等
按需代码(Code On Demand)
- 客户端可下载/接收服务端传递的代码(如:js)
统一接口如何设计
资源标识
- 资源是任何可以命名的事物,比如用户、评论等
- 每个资源可以通过 URI 被唯一标识
例子
https://api.github.com/users
https://api.github.com/users/i7eo
在设计 URI 时面临深层关系时建议遵循最大三层表述的原则如:
/users/i7eo/repositories/eo-imooc/blob/main
其中 /users/i7eo
为一层表述,依此类推。通过表述来操作资源
- 表述(Representational),比如:JSON、XML 等
- 客户端不能直接操作(SQL)服务端资源
- 客户端应该通过表述(JSON)操作服务端资源
自描述信息
- 每个消息(请求或响应)必须提供足够的信息让接受者理解
- 媒体类型(application/json、application/xml 等)
- HTTP 方法(GET/POST/PATCH(部分替换)/PUT(全量替换)/DELETE)
- 是否缓存(Cache-Control)
超媒体作为应用状态引擎
- 超媒体(带文字的链接)
- 应用状态(一个网页)
- 引擎(驱动、跳转)
例子
a
标签RESTful API 设计
组成要素
- 基本 URI
- 标准 HTTP Method
- 传输媒体类型 JSON/XML
例子
请求设计规范
- URI 使用名词,尽可能使用复数,如:/users
- URI 使用嵌套表示关联关系,如:/users/12/repos/5
- 使用正确的 HTTP 方法,如 GET/POST/PATCH(部分替换)/PUT(全量替换)/DELETE
- 不符合上述要求的 CRUD 操作,可考虑使用: POST {资源}/{操作}
响应设计规范
- 查询(响应筛选项)
例子
https://api.github.com/users?since=100
- 分页
例子
https://api.github.com/users?page=2&per_page=50
- 字段过滤(按照请求中的参数指定,指定返回结果)
例子
https://api.github.com/users/i7eo?fields=name
- 状态码
- 运行时错误(500)
- 逻辑错误,如找不到(404)、表中无查询字段即先决条件失败(412)、无法处理实体即参数格式不对(422)
- 处理成功无返回即删除成功(204)
例子
- 错误处理(错误信息,message/errors)
安全
- HTTPS
- 用户鉴权(JWT)
- 限流(limit rate)
开发者友好
- 文档
- 超媒体