Open leohxj opened 5 years ago
这个库不搞出来简直对不起你
补下知识而已,学习学习
添加几个带中间件概念的库:
so-fetch: 区分了 request/response 的 interceptor
umi-request: 也是通过返回对象实现
vue-resource: middleware 定义的时候, 通过 return 区分哪些对 req 的操作,哪些对 res 的操作。
intereq: 区分三类拦截器, onRequest, onResponse, onError
frest: 也是分三类拦截器
区分了 request, reponse 的修改。middleware vs afterware
wretch: 类似 Koa 的中间件,通过 next 触发下一个调用, 概念叫中间件
fetch-plus:类似 koa 支持异常中间件写法 好好研究
中间件示例: 这就和 koa 很像了。
关键源码: 借助 koa-compose , 内部维护了一个 middlewares 数组。通过 use
添加中间件
通过 compose 组合 middlewares 和内置带一个 fetchMiddleware
将中间件通过 composeMiddleware(context) 触发。
借助 koa-compose 使得中间件定义接受的参数可以为 (context, next),
前端提到网络请求通常是指浏览器,但现在随着 Node.js、小程序的出现,网络请求不再局限于浏览器。
实现原理
浏览器端
基于 XHR 或 Fetch 实现。
node.js
基于node自带的 ttp/https/http2 模块实现 http 请求。
其他
比如各种小程序,比如微信的 wx.request, 支付宝的 my.httpRequest. 都是自己封装的请求模块。
如何抹平调用一致性
最常见的场景就是同构模块,建议将实际发送请求的模块做封装,依据不同环境做实例化。对不同环境提供不同的入口文件,通过打包工具自动载入(基于 package.json 的 browser/main 字段)或自行引入指定文件。
请求库对比
- 可设置超时
- 支持 CSRF
- post 数据提交方式简化
- response 返回处理简化
- api 超时支持
- api 请求缓存支持
- 支持处理 gbk 类 axios 的 request 和 response 拦截器(interceptors)支持
- 统一的错误处理方式
- 浏览器环境下,轻量且非常轻量 。
- 支持多种JavaScript 运行环境
- 支持请求/响应拦截器。
- 自动转换 JSON 数据。
- 支持切换底层 Http Engine,可轻松适配各种运行环境。
- 浏览器端支持全局Ajax拦截 。
- H5页面内嵌到原生 APP 中时,支持将 http 请求转发到 Native。支持直接请求图片。
- ie9+
- 支持 Form 数据格式
- 自定义 http header
- node-fetch
- 支持取消请求
- 支持缓存
- Method shortcuts (
ky.post()
)- Treats non-2xx status codes as errors
- Retries failed requests
- JSON option
- Timeout support
- URL prefix option
- Instances with custom defaults
- Hooks
基于 RxJS
还有一部分请求库,返回的不是 Promise 对象,而是 Observable 对象, 基于 RxJS 做的封装。
参考