基于小程序请求接口 wx.request 封装的类 axios 请求

Introduction

feature

  • 支持 wx.request 所有配置项
  • 支持 axios 调用方式
  • 支持 自定义 baseUrl
  • 支持 自定义响应状态码对应 resolve 或 reject 状态
  • 支持 对响应(resolve/reject)分别做统一的额外处理
  • 支持 转换请求数据和响应数据
  • 支持 请求缓存(内存或本地缓存),可设置缓存标记、过期时间

use

app.js @onLaunch

  1. import axios form 'axios'
  2. axios.creat({
  3. header: {
  4. content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
  5. },
  6. baseUrl: 'https://api.baseurl.com',
  7. ...
  8. });

page.js

  1. axios
  2. .post("/url", { id: 123 })
  3. .then((res) => {
  4. console.log(response);
  5. })
  6. .catch((err) => {
  7. console.log(err);
  8. });

API

  1. axios(config) - 默认get
  2. axios(url[, config]) - 默认get
  3. axios.get(url[, config])
  4. axios.post(url[, data[, config]])
  5. axios.cache(url[, data[, config]]) - 缓存请求(内存)
  6. axios.cache.storage(url[, data[, config]]) - 缓存请求(内存 & local storage
  7. axios.creat(config) - 初始化定制配置,覆盖默认配置

config

默认配置项说明

  1. export default {
  2. // 请求接口地址
  3. url: undefined,
  4. // 请求的参数
  5. data: {},
  6. // 请求的 header
  7. header: "application/json",
  8. // 超时时间,单位为毫秒
  9. timeout: undefined,
  10. // HTTP 请求方法
  11. method: "GET",
  12. // 返回的数据格式
  13. dataType: "json",
  14. // 响应的数据类型
  15. responseType: "text",
  16. // 开启 http2
  17. enableHttp2: false,
  18. // 开启 quic
  19. enableQuic: false,
  20. // 开启 cache
  21. enableCache: false,
  22. /** 以上为wx.request的可配置项,参考 https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html */
  23. /** 以下为wx.request没有的新增配置项 */
  24. // {String} baseURL` 将自动加在 `url` 前面,可以通过设置一个 `baseURL` 便于传递相对 URL
  25. baseUrl: "",
  26. // {Function} (同axios的validateStatus)定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 reject
  27. validateStatus: undefined,
  28. // {Function} 请求参数包裹(类似axios的transformRequest),通过它可统一补充请求参数需要的额外信息(appInfo/pageInfo/场景值...),需return data
  29. transformRequest: undefined,
  30. // {Function} resolve状态下响应数据包裹(类似axios的transformResponse),通过它可统一处理响应数据,需return res
  31. transformResponse: undefined,
  32. // {Function} resolve状态包裹,通过它可做接口resolve状态的统一处理
  33. resolveWrap: undefined,
  34. // {Function} reject状态包裹,通过它可做接口reject状态的统一处理
  35. rejectWrap: undefined,
  36. // {Boolean} _config.useCache 是否开启缓存
  37. useCache: false,
  38. // {String} _config.cacheName 缓存唯一key值,默认使用url&data生成
  39. cacheName: undefined,
  40. // {Boolean} _config.cacheStorage 是否开启本地缓存
  41. cacheStorage: false,
  42. // {Any} _config.cacheLabel 缓存标志,请求前会对比该标志是否变化来决定是否使用缓存,可用useCache替代
  43. cacheLabel: undefined,
  44. // {Number} _config.cacheExpireTime 缓存时长,计算缓存过期时间,单位-秒
  45. cacheExpireTime: undefined,
  46. };

实现

axios.js

  1. import Axios from "./axios.class.js";
  2. // 创建axios实例
  3. const axiosInstance = new Axios();
  4. // 获取基础请求axios
  5. const { axios } = axiosInstance;
  6. // 将实例的方法bind到基础请求axios上,达到支持请求别名的目的
  7. axios.creat = axiosInstance.creat.bind(axiosInstance);
  8. axios.get = axiosInstance.get.bind(axiosInstance);
  9. axios.post = axiosInstance.post.bind(axiosInstance);
  10. axios.cache = axiosInstance.cache.bind(axiosInstance);
  11. axios.cache.storage = axiosInstance.storage.bind(axiosInstance);

Axios class

初始化

  • defaultConfig 默认配置,即 defaults.js
  • axios.creat 用户配置覆盖默认配置
  • 注意配置初始化后 mergeConfig 不能被污染,config 需通过参数传递
  1. constructor(config = defaults) {
  2. this.defaultConfig = config;
  3. }
  4. creat(_config = {}) {
  5. this.defaultConfig = mergeConfig(this.defaultConfig, _config);
  6. }

请求别名

  • axios 兼容 axios(config) 或 axios(url[, config]);
  • 别名都只是 config 合并,最终都通过 axios.requst()发起请求;
  1. axios($1 = {}, $2 = {}) {
  2. let config = $1;
  3. // 兼容axios(url[, config])方式
  4. if (typeof $1 === 'string') {
  5. config = $2;
  6. config.url = $1;
  7. }
  8. return this.request(config);
  9. }
  10. post(url, data = {}, _config = {}) {
  11. const config = {
  12. ..._config,
  13. url,
  14. data,
  15. method: 'POST',
  16. };
  17. return this.request(config);
  18. }

请求方法 _request

请求配置预处理

  • 实现 baseUrl
  • 实现 transformRequest(转换请求数据)
  1. _request(_config = {}) {
  2. let config = mergeConfig(this.defaultConfig, _config);
  3. const { baseUrl, url, header, data = {}, transformRequest } = config;
  4. const computedConfig = {
  5. header: {
  6. 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
  7. ...header,
  8. },
  9. ...(baseUrl && {
  10. url: combineUrl(url, baseUrl),
  11. }),
  12. ...(transformRequest &&
  13. typeof transformRequest === 'function' && {
  14. data: transformRequest(data),
  15. }),
  16. };
  17. config = mergeConfig(config, computedConfig);
  18. return wxRequest(config);
  19. }

wx.request

发起请求、处理响应

  • 实现 validateStatus(状态码映射 resolve)
  • 实现 transformResponse(转换响应数据)
  • 实现 resolveWrap、rejectWrap(响应状态处理)
  1. export default function wxRequest(config) {
  2. return new Promise((resolve, reject) => {
  3. wx.request({
  4. ...config,
  5. success(res) {
  6. const {
  7. resolveWrap,
  8. rejectWrap,
  9. transformResponse,
  10. validateStatus,
  11. } = config;
  12. if ((validateStatus && validateStatus(res)) || ifSuccess(res)) {
  13. const _resolve = resolveWrap ? resolveWrap(res) : res;
  14. return resolve(
  15. transformResponse ? transformResponse(_resolve) : _resolve
  16. );
  17. }
  18. return reject(rejectWrap ? rejectWrap(res) : res);
  19. },
  20. fail(res) {
  21. const { rejectWrap } = config;
  22. reject(rejectWrap ? rejectWrap(res) : res);
  23. },
  24. });
  25. });
  26. }

请求缓存的实现

  • 默认使用内存缓存,可配置使用 localStorage
  • 封装了 Storage 与 Buffer 类,与 Map 接口一致:get/set/delete
  • 支持缓存标记&过期时间
  • 缓存唯一 key 值,默认使用 url&data 生成,无需指定
  1. import Buffer from '../utils/cache/Buffer';
  2. import Storage from '../utils/cache/Storage';
  3. import StorageMap from '../utils/cache/StorageMap';
  4. /**
  5. * 请求缓存api,缓存于本地缓存中
  6. */
  7. storage(url, data = {}, _config = {}) {
  8. const config = {
  9. ..._config,
  10. url,
  11. data,
  12. method: 'POST',
  13. cacheStorage: true,
  14. };
  15. return this._cache(config);
  16. }
  17. /**
  18. * 请求缓存
  19. * @param {Object} _config 配置
  20. * @param {Boolean} _config.useCache 是否开启缓存
  21. * @param {String} _config.cacheName 缓存唯一key值,默认使用url&data生成
  22. * @param {Boolean} _config.cacheStorage 是否开启本地缓存
  23. * @param {Any} _config.cacheLabel 缓存标志,请求前会对比该标志是否变化来决定是否使用缓存,可用useCache替代
  24. * @param {Number} _config.cacheExpireTime 缓存时长,计算缓存过期时间,单位-秒
  25. */
  26. _cache(_config) {
  27. const {
  28. url = '',
  29. data = {},
  30. useCache = true,
  31. cacheName: _cacheName,
  32. cacheStorage,
  33. cacheLabel,
  34. cacheExpireTime,
  35. } = _config;
  36. const computedCacheName = _cacheName || `${url}#${JSON.stringify(data)}`;
  37. const cacheName = StorageMap.getCacheName(computedCacheName);
  38. // return buffer
  39. if (useCache && Buffer.has(cacheName, cacheLabel)) {
  40. return Buffer.get(cacheName);
  41. }
  42. // return storage
  43. if (useCache && cacheStorage) {
  44. if (Storage.has(cacheName, cacheLabel)) {
  45. const data = Storage.get(cacheName);
  46. // storage => buffer
  47. Buffer.set(
  48. cacheName,
  49. Promise.resolve(data),
  50. cacheExpireTime,
  51. cacheLabel
  52. );
  53. return Promise.resolve(data);
  54. }
  55. }
  56. const curPromise = new Promise((resolve, reject) => {
  57. const handleFunc = (res) => {
  58. // do storage
  59. if (useCache && cacheStorage) {
  60. Storage.set(cacheName, res, cacheExpireTime, cacheLabel);
  61. }
  62. return res;
  63. };
  64. this._request(_config)
  65. .then((res) => {
  66. resolve(handleFunc(res));
  67. })
  68. .catch(reject);
  69. });
  70. // do buffer
  71. Buffer.set(cacheName, curPromise, cacheExpireTime, cacheLabel);
  72. return curPromise;
  73. }

基于小程序请求接口 wx.request 封装的类 axios 请求的更多相关文章

  1. 【微信小程序】调用wx.request接口需要注意的问题

    写在前面 之前写了一篇<微信小程序实现各种特效实例>,上次的小程序的项目我负责大部分前端后台接口的对接,然后学长帮我改了一些问题.总的来说,收获了不少吧! 现在项目已经完成,还是要陆陆续续 ...

  2. 【小程序】调用wx.request接口时需要注意的问题

    写在前面 之前写了一篇<微信小程序实现各种特效实例>,上次的小程序的项目我负责大部分前端后台接口的对接,然后学长帮我改了一些问题.总的来说,收获了不少吧! 现在项目已经完成,还是要陆陆续续 ...

  3. 微信小程序:使用wx.request()请求后台接收不到参数

    问题描述: 微信小程序:wx.request()请求后台接收不到参数,我通过wx.request()使用POST方式调用请求,参数传递不到后台 解决方案: Content-Type': 'applic ...

  4. 微信小程序开发 [05] wx.request发送请求和妹纸图

    1.wx.request 微信小程序中用于发起网络请求的API就是wx.request了,具体的参数太多,此处就不再一一详举了,基本使用示例如下: wx.request({ url: 'test.ph ...

  5. 小程序不支持wx.request同步请求解决方法

    小程序为了用户体验,所有的request均为异步请求,不会阻塞程序运行 百牛信息技术bainiu.ltd整理发布于博客园 所以当你需要同步请求,锁死操作时,最好将所有的逻辑写在success:func ...

  6. 关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  7. 微信小程序--后台交互/wx.request({})方法/渲染页面方法 解析

    小程序的后台获取数据方式get/post具体函数格式如下:wx.request({}) data: { logs:[] }, onLoad:function(){ this.getdata(); } ...

  8. 一,前端---关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  9. 微信小程序 在使用wx.request时显示加载中

    微信小程序中,向后台请求数据是,通常想给用户提示正在加载中,如下图: 我们可以用wx.showLoading(OBJECT),当请求服务器的地方多了,怎么才能不每次都要去调用函数,我们只要对wx.re ...

随机推荐

  1. Java实现 蓝桥杯 算法训练 第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...

  2. (Java实现) 友好城市

    1263:[例9.7]友好城市 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1867 通过数: 1032 [题目描述] Palmia国有一条横贯东西的大河,河有笔直的南北两岸, ...

  3. Oracle RMAN各类压缩算法对比测试

    1.背景概述 2.本次测试环境基本信息 3.测试步骤 3.1. 使用BCO进行压缩备份 3.2. 不使用压缩备份 3.3. 使用ACO中LOW级别进行压缩备份 3.4. 使用ACO中MEDIUM级别进 ...

  4. [源码解析] Flink的groupBy和reduce究竟做了什么

    [源码解析] Flink的groupBy和reduce究竟做了什么 目录 [源码解析] Flink的groupBy和reduce究竟做了什么 0x00 摘要 0x01 问题和概括 1.1 问题 1.2 ...

  5. Javascript 随机显示数组元素

    $(function(){ var wx_arr = ['gb3055','gb6365']; var storage = window.localStorage; function random_w ...

  6. 解决Maven静态资源过滤问题

    在项目的pom.xml中添加下面的内容 <build> <resources> <resource> <directory>src/main/java& ...

  7. Ubuntu18.04美化MacOS(新更grub界面美化)

    写在前面的话: 在美化过程中大多数资源来自境外网站,下载时速度特别慢,写这篇博客一是为了给读者看,也是为了自己保存资源并记录ubuntu18.04的使用,避免你们或是自己以后再花费大量时间去百度方法和 ...

  8. Lombok介绍和使用

    1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...

  9. skfpdb.db、cc3268.dll、system_V2.dat、JI60JS.dat文件内容、发票数据查询

    cc3268.dll.skfpdb.db.xxxxx_V2.dat,system.dat,JI60JS.dat,log.dat,system_V2.dat,JI60JS_V2.dat,log_V2.d ...

  10. windbg分析一次大查询导致的内存暴涨

    项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...