restful API
为什么叫REST
- Representational State Transfer
- Representational: 数据的表现形式 (JSON, XML …)
- State: 当前状态或者数据
- Transfer: 数据传输
6个限制
-
客户-服务(Client-Server)
- 关注点分离
- 服务端专注数据存储, 提升了简单性
- 客户端专注用户界面, 提升了可移植性
- 无状态(Stateless)
- 所有用户会话信息都保存在客户端
- 每次请求必须包括所有信息, 不能依赖上下文信息
- 服务端不保存会话信息, 提升了简单性, 可靠性, 可见性
- 缓存(Cache)
- 所有服务端响应都要被标为可缓存或不可缓存
- 减少前后端交互, 提升了性能
- 统一接口(Uniform Interface)
- 接口设计尽可能统一通用, 提升了简单性, 可见性
- 接口与实现解耦, 使前后端可以独立开发迭代
- 分层系统(Layered System)
- 每次只知道相邻的一层, 后面隐藏的就不知道了
- 客户端不知道是和代理还是和真正的服务器通信
- 按需代码(Code-On-Demand可选)
- 客户端可以下载运行服务端传来的代码(比如JS)
- 通过减少一些功能, 简化了客户端
统一接口的限制
- 资源的标识
- 资源是任何可以命名的事物,比如用户, 评论等
- 每个资源可以通过URI被唯一的标识
a. https://api.github.com/users
b. https://api.github.com/users/lewi617
- 通过表述来操作资源
- 表述就是Representational, 比如 JSON, XML …
- 客户端不能直接操作(比如SQL)服务端资源
- 客户端应该通过表述 (比如JSON)来操作资源
- 自描述消息
- 每个消息(请求或响应)必须提供足够的信息让接受者理解
- 媒体(application/json application/xml)
- HTTP方法: GET(查), POST(增), DELETE(删)
- 是否缓存(Cache-Control)
- 超媒体作为应用状态引擎
- 超媒体: 带文字的连接
- 应用状态: 一个网页
- 引擎: 驱动, 跳转
- 合起来: 点击链接跳转到另外一个网页
什么是restful API
符合REST架构风格的API
-
具体:
- 基本的URI: 如: https://api.github.com/users
- 标准的HTTP方法, 如 GET(查), POST(增), DELETE(删), PUT, PATCH
- 传输的数据媒体类型, 如: JSON, XML
-
现实举例:
- GET/users # 获取user列表
- GET/users/12 # 查看某个具体的user
- POST/users # 新建一个user
- PUT/users/12 # 更新user12
- DELETE/users/12 # 删除user12
-
请求设计规范
- URI使用名词,尽量用复数,如/users
- URI使用嵌套表示关联关系, 如: users/12/repos/5
- 使用正确的http方法, 如 GET(查), POST(增), DELETE(删), PUT, PATCH
- 不符合CRUD的情况: POST/action/子资源
-
响应设计规范
- 查询
- 分页
- 字段过滤
- 状态码
- 错误处理
-
安全
HTTPS 鉴权 限流 -
开发者友好
文档 超媒体
koa
一些命令行:
cd /d/code 切换到文件夹
mkdir xxx 创建文件夹
code xxx vsCode打开文件夹
搭建koa程序
npm init: 生成package.json文件, 管理依赖
npm i koa --save 安装koa
编写index.js --> 执行node index.js启动程序
const Koa = require('koa') // 1.引入koa
const app = new Koa() //1.创建一个应用程序
app.use(ctx => { //2.中间件
ctx.body = 'hello world 111'
})
app.listen(3000, () => console.log('程序已启动')) // 1.启动应用程序 监听端口
npm i nodemon --save-dev // 修改文件后程序自动启动 只在开发阶段使用
由于nodemon 不是全局安装的所以使用时需要修改脚本如下:
"scripts": {
"start": "nodemon index.js"
},
执行npm start 启动程序
编写koa中间件及洋葱模型
中间件:
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next) =&